内部排序算法

#ifndef _SORT_H_
#define _SORT_H_
#endif     

#include  
#include  

void bubble_sort(int *a,int len)
{
int i,j,t;
for(i=0;i    for(j=0;j        if(a[j]>a[j+1])
        {
            t = a[j];
            a[j] = a[j+1];
            a[j+1] = t;
        }
}

/* //冒泡
int main()
{
    int i;
    int a[10] = {10,3,8,6,4};
    bubble_sort(a,10);
    for(i=0;i<10;i++)
        printf("%d  ",a[i]);
}

*/



void insert_sort(int *a,int len)
{
    int i,j,tmp;
    for(i=1;i    {
        tmp = a[i];
        j = i-1;//j是有序序列最后一个数的下标
        while(j>=0&&tmp        {    
            a[j+1] = a[j];//不是插入位置,数往后移动
            j--;
        }
        a[j+1] = tmp;
    }
}

/*//直接插入
int main(int argc, char *argv[])
{
    int a[10]={10,3,8,6,4},i;
    insert_sort(a,10);
    for(i=0;i<10;i++)
        printf("%d  ",a[i]);
    return 0;
}

*/

void quick_sort(int *a,int low,int high);
int find_pos(int *a,int low,int high);

void quick_sort(int *a,int low,int high)
{
    int pos;
    if(low    {
        pos = find_pos(a,low,high);
        quick_sort(a,low,pos-1);
        quick_sort(a,pos+1,high);
    }
}
int find_pos(int *a,int low,int high)//寻找第一个数的准确位置
{
    int val = a[low];
    while(low    {
        while(low=val)//(low            high--;
        a[low] = a[high];
        while(low            low++;
        a[high] = a[low];
    }
    //循环完后high = low
    a[high] = val;
    return high;
}

/*  快排
int main(int argc, char *argv[])
{
    int a[10] = {10,3,8,6,4},i;
    quick_sort(a,0,4);
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
    return 0;
}

*/



void swap(int *a,int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
void percdown(int a[],int node,int len)
{
    int i;
    int temp = a[node];
    for(i=2*node;i<=len;i*=2)
    {
        if(i            i++;//i指向最大的孩子
        if(a[i]>temp)//最大的孩子和双亲进行比较
        {
            a[node] = a[i];//让最大的孩子的值赋值给双亲结点
            node = i;//node就指向换数的那个孩子
            /*这两句最难理解,但是又很好理解其实就是一个换数的过程*/
        }
    }
    a[node] = temp;
}
void heap_sort(int *a,int len)
{
    int i;
    for(i=len/2;i>0;i--)//len/2:最后一个双亲结点  *从下往上,从右往左*
        percdown(a,i,len);//len:当前堆里的元素个数  
    for(i=len;i>1;i--)
    {
        swap(&a[1],&a[i]);
        percdown(a,1,i-1);
    }
    
}
/*//堆排序
int main()
{
    int a[10] = {10,3,8,6,4};
    heap_sort(a,10);
    int i;
    for(i=0;i<10;i++)
        printf("%d  ",a[i]);
    return 0;
}

*/
    
    //将有序的X[s..u]和X[u+1..v]归并为有序的Z[s..v]  
    void merge(int X[], int Z[], int s, int u, int v)  
    {  
        int i, j, q;  
        i = s;  
        j = u + 1;  
        q = s;  
      
        while( i <= u && j<= v )  
        {  
            if( X[i] <= X[j] )  
                Z[q++] = X[i++];  
            else  
                Z[q++] = X[j++];  
        }  
      
        while( i <= u )   //将X中剩余元素X[i..u]复制到Z  
            Z[q++] = X[i++];  
        while( j <= v )   //将X中剩余元素X[j..v]复制到Z  
            Z[q++] = X[j++];  
    }  
      
    /* X[0..n-1]表示参加排序的初始序列
     * t为某一趟归并时子序列的长度
     * 整型变量i指出当前归并的两个子序列中第1个子序列的第1个元素的位置
     * Y[0..n-1]表示这一趟归并后的结果
    */  
    void mergePass(int X[], int Y[], int n, int t)  
    {  
        int i = 0, j;  
        while( n - i >= 2 * t )     //将相邻的两个长度为t的各自有序的子序列合并成一个长度为2t的子序列  
        {  
            merge(X, Y, i, i + t - 1, i + 2 * t - 1);  
            i = i + 2 * t;  
        }  
      
        if( n - i > t )       //若最后剩下的元素个数大于一个子序列的长度t时  
            merge(X, Y, i, i + t - 1, n - 1);  
        else             //n-i <= t时,相当于只是把X[i..n-1]序列中的数据赋值给Y[i..n-1]  
            for( j = i ; j < n ; ++j )  
                Y[j] = X[j];  
    }  
      
    void mergeSort(int X[], int n)  
    {  
        int t = 1;  
        int *Y = (int *)malloc(sizeof(int) * n);  
        while( t < n )  
        {  
            mergePass(X, Y, n, t);  
            t *= 2;  
            mergePass(Y, X, n, t);  
            t *= 2;  
        }  
        free(Y);  
    }  
      
    void print_array(int array[], int n)  
    {  
        int i;  
        for( i = 0 ; i < n ; ++i )  
            printf("%d ", array[i]);  
        printf("\n");  
    }  
    



#include  
#include  
#include "sort.h"

    
 
    int main()  
    {  
        int a[] = {65, 6, 1, 90, 78, 67, 35, 23, 3, 88};  
        
        int choose=1;
        
        int i;
        
        int size;
        
            while (choose!=0)
    {
    printf ("\n*************************************\n");
    printf ("1. 直接插入排序\n");
    printf ("2. 冒泡排序\n");
    printf ("3. 快速排序\n");
    printf ("4. 堆排序\n");
    printf ("10. 归并排序\n");
    printf ("6. 退出\n\n");
    printf ("\n*************************************\n");
    
        
        printf ("请输入你想执行的操作:   ");
        
        scanf("%d",&choose);
        
        switch(choose)
        {
            case 1:
                
            insert_sort(a,10);
            
            for(i=0;i<10;i++)
            
          printf("%d  ",a[i]);
          
             break;
                                              
            
             case 2:
                 
           bubble_sort(a,10);
           
          for(i=0;i<10;i++)
         
          printf("%d  ",a[i]);
                 
            break;
              
        case 3:
            
        quick_sort(a,0,9);
        
         for(i=0;i<10;i++)
         
        printf("%d ",a[i]);
         
         break;
                          
        case 4:
            
        heap_sort(a,10);
        
         int i;
         
        for(i=0;i<10;i++)
        
        printf("%d  ",a[i]);
            
            break;
            
                   
        case 5:
        
         size = sizeof(a) / sizeof(int);  
        
        mergeSort(a, size);  
        
        print_array(a, size);  
        
         break;
        
         case 6:
        
         choose=0;
        
                                                              
         break;
        
    }  
}
}
   

  

你可能感兴趣的:(内部排序算法)