常用的排序算法

[cpp] view plain copy
 
 print?
  1. #include <stdio.h>   
  2. #include <stdlib.h>  
  3. /* 
  4. 算法的分类 
  5. 排序算法 
  6. 插入排序(直接插入排序、希尔排序) 
  7. 选择排序(简单选择排序、堆排序) 
  8. 归并排序 
  9. 基数排序 
  10. */  
  11. ///////////////////////////////////////////////////////////  
  12. /*堆排序*/  
  13. /** 
  14. *@param A[] 完全二叉树 
  15. *@param i 看中的那个父结点 
  16. *@param size 结点的总数 
  17. **/  
  18. void heapify ( int a [] , int i , int size ){  
  19.     int left = i*2+1 ;  
  20.     int right = i*2 +2 ;  
  21.     int largest = i ;  
  22.     int temp = 0 ;  
  23.     if ( i <0 )  
  24.         return ;  
  25.     if ( left >=size  )  
  26.     {  
  27.         heapify(a, i-1 , size);  
  28.         return 0;  
  29.     }  
  30.     else if ( a[left] > a[largest])   
  31.     {  
  32.         temp = a[largest] ;  
  33.         a[largest] = a[left] ;  
  34.         a[left] = temp ;  
  35.     }  
  36.     if (right >= size)  
  37.         ;  
  38.     else if ( a[right]> a[largest])   
  39.     {  
  40.         temp = a[largest] ;  
  41.         a[largest] = a[right] ;  
  42.         a[right] = temp ;  
  43.     }  
  44.     heapify(a,i-1,size);          
  45. }   
  46. //int b []={0,2,6,2,34,8,64,52,32,21,6};  
  47. void heap_sort( int a [] , int size ){  
  48.     int i  ;  
  49.     for ( i = size-1 ; i>=0 ; i-- ){  
  50.         heapify(a,i,i+1) ;  
  51.         printf("size =%d max = %d ",i+1,a[0]);  
  52.         int temp = a [0] ;  
  53.         a[0] = a[i] ;  
  54.         a[i] = temp;   
  55.     }  
  56.   
  57. }  
  58. /////////////////////////////////////////////////////////////  
  59. /*归并排序*/  
  60. void mergearray(int a[], int first, int mid, int last, int temp[])  
  61.   
  62. {  
  63.   
  64.        int i = first, j = mid + 1;  
  65.        int m = mid,   n = last;  
  66.        int k = 0;    
  67.        while (i <= m && j <= n)  
  68.        {  
  69.   
  70.               if (a[i] < a[j])  
  71.                      temp[k++] = a[i++];  
  72.               else  
  73.                      temp[k++] = a[j++];  
  74.        }   
  75.   
  76.        while (i <= m)  
  77.               temp[k++] = a[i++];        
  78.   
  79.        while (j <= n)  
  80.               temp[k++] = a[j++];       
  81.   
  82.        for (i = 0; i < k; i++)  
  83.               a[first + i] = temp[i];  
  84.   
  85. }  
  86.   
  87.   
  88.   
  89. void merge_sort( int a[] , int first , int last , int *temp){  
  90.     if ( first < last){  
  91.         int mid = (first + last) /2 ;   
  92.         merge_sort(a ,first,mid , temp) ;  
  93.         merge_sort(a,mid+1,last , temp) ;  
  94.   
  95.         mergearray(a,first,mid,last , temp);  
  96.     }  
  97. }  
  98.   
  99. int MergeSort( int a [] , int n ){  
  100.     int p [n+1];  
  101.   
  102.     if ( p == NULL)  
  103.         return 0 ;  
  104.     else   
  105.         printf("开闭空间:%d ",n );  
  106.     merge_sort(a, 0,n-1,p) ;  
  107.       
  108.     //free(p) ;  
  109.     return 1 ;  
  110. }  
  111.   
  112. //////////////////////////////////////////////  
  113. /*选择排序*/  
  114. selectionSort( int a[], long len ){  
  115.     int j = 0 , i = 0 ;  
  116.     int tmp ;     
  117.     long  max_pos  ;  
  118.     for ( i = len-1;i>=1;i--){  
  119.         max_pos =  i ;  
  120.         for( j = 0 ; j<i ; j++ )  
  121.             if( a[max_pos] <a[j])   
  122.                 max_pos = j ;   
  123.             if( max_pos !=i ) {  
  124.                 tmp = a[i] ;  
  125.                 a[i] = a[max_pos] ;  
  126.                 a[max_pos] = tmp;                 
  127.             }  
  128.     }  
  129.   
  130.   
  131. }  
  132.   
  133. /*冒泡排序*/  
  134. void doubleSort(int a [] , long len){  
  135.   
  136.     int i = len -1 ;  
  137.     int j = len -1 ;  
  138.     int temp ;  
  139.     for ( i =len;i >0; i--){  
  140.         for ( j = i; j >0  ; j-- ){  
  141.             if( a[j]<a[j-1]){  
  142.                 temp = a[j] ;  
  143.                 a[j] = a[j-1] ;  
  144.                 a[j-1] = temp ;   
  145.             }  
  146.         }  
  147.     }  
  148. }  
  149.   
  150. /*快速排序*/  
  151. int partiion( int a [], int left , int right){  
  152.     a[0] = a[left] ;  
  153.   
  154.     while(left<right){  
  155.         while(left<right && a[0]<a[right])  
  156.             right -- ;  
  157.         if( left<right){  
  158.             // update benchmark  
  159.             a[left] = a[right];  
  160.             left ++ ;  
  161.         }  
  162.   
  163.         while (left<right&&a[0]>a[left])  
  164.             left++;  
  165.         if( left < right ){  
  166.             a[right] = a[left];  
  167.             right -- ;  
  168.         }  
  169.     }  
  170.   
  171.     a[left] = a[0] ;  
  172.     return left;  
  173. }  
  174.   
  175. void quickSort( int a [], int left, int right){  
  176.     int i ;  
  177.     if ( left<right){  
  178.         i = partiion(a,left,right);  
  179.         quickSort(a,left,i-1);  
  180.         quickSort(a,i+1,right);  
  181.     }  
  182. }  
  183.   
  184. /////////////////////////////////////////////////////////  
  185. /*简单插入排序*/  
  186. void insertSort( int a[] , long len ){  
  187.     int i , j;   
  188.     int temp ;  
  189.     for ( i =0; i <=len -1 ; i++) {  
  190.         j = i+ 1;   
  191.         if ( a[j] <a[i])  
  192.         {  
  193.             temp = a[j] ;  
  194.             while(temp <a[i]){  
  195.                 a[i+1] = a[i] ;  
  196.                 i -- ;   
  197.             }  
  198.             // insert data   
  199.             a[i+1] = temp ;  
  200.         }  
  201.         i = j-1 ;  
  202.           
  203.     }  
  204. }  
  205. /*希尔排序*/  
  206.   
  207. void shellSort ( int a [] , int len ){  
  208.     int temp ,gap;   
  209.     int i , j ;   
  210.     for( gap = len/2; gap>0 ;gap/=2 ){  
  211.         for ( i =0 ; i <gap ; i ++ ){  
  212.             for ( j = i+gap ; j <len;j++){  
  213.                 /*最起码要小于 已经排好序里面的最大值*/  
  214.                 if(a[j]<a[j-gap]){  
  215.                     temp = a[j] ;  
  216.                     int k = j-gap ;       
  217.                     while(k >=0 && a[k]>temp ){  
  218.                         a [k+gap ] = a[k] ;  
  219.                         k-= gap ;  
  220.                     }  
  221.                     a[k+gap ] = temp;  
  222.                 }  
  223.             }  
  224.           
  225.         }  
  226.     }  
  227.   
  228. }  
  229.   
  230. void swap(int a [] ){  
  231.     a[1] = a[2];  
  232. }  
  233. int main ( void ) {  
  234.   
  235.     int a [6]={34,8,64,52,32,21};  
  236.     int b []={0,2,6,2,34,8,64,52,32,21,6};  
  237. //  insertSort(a,6);  
  238.     //shellSort( a , 6) ;  
  239. //  selectionSort(a,6);  
  240.     //doubleSort(a,11);   
  241. //  quickSort(b,1,10);  
  242. //  MergeSort(b,sizeof(b)/sizeof(b[0]));  
  243.     heap_sort(b,sizeof(b)/sizeof(b[0]));  
  244.     int i ;  
  245.     //swap(b);  
  246.     // for(  i  =0 ; i<6 ;i++)  
  247.     //  printf("%d ",a[i]);  
  248.     for(  i  =0; i<sizeof(b)/sizeof(b[0]) ;i++)  
  249.         printf("%d ",b[i]);  
  250.     printf(" ");  
  251.     return 0;  
  252. }  
原文地址:https://www.cnblogs.com/php-rearch/p/6096695.html