zoukankan      html  css  js  c++  java
  • 常用的排序算法

    [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. }  
  • 相关阅读:
    协方差的意义
    ios7新特性实践
    微信支付大盗--黑色产业链
    UVA 297 Quadtrees(四叉树建树、合并与遍历)
    HDU 2876 Ellipse, again and again
    java中接口的定义与实现
    Oracle Linux 6.3下安装Oracle 11g R2(11.2.0.3)
    Fortran使用隐形DO循环和reshape给一维和多维数组赋初值
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
  • 原文地址:https://www.cnblogs.com/php-rearch/p/6096695.html
Copyright © 2011-2022 走看看