各類排序算法實現

  1. #include <stdio.h> 
  2. #include <memory.h> 
  3.  
  4. #define LEN 6 
  5.  
  6. //O(n2) 
  7. //stable 
  8. void DirectInsertSort(int *a, int len) 
  9.     int n = 0; 
  10.     int x = 0; 
  11.     int tmp = 0; 
  12.     int move = 0; 
  13.     int y = 0; 
  14.  
  15.     for(n=0; n<len; n++) 
  16.     { 
  17.         tmp = a[n]; 
  18.         for(x=n-1; x>=0; x--) 
  19.             if(tmp>=a[x]) 
  20.             { 
  21.                 a[x+1] = tmp; 
  22.                 break
  23.             } 
  24.             else 
  25.             { 
  26.                 a[x+1] = a[x]; 
  27.                 if(x==0) a[x] = tmp; 
  28.             } 
  29.     }    
  30.  
  31. //O(nlogn) 
  32. //stable 
  33. void BinaryInsertSort(int *a, int len) 
  34.     int n = 0, x = 0; 
  35.     int left = 0, mid = 0, right = len-1; 
  36.     int tmp = 0, k; 
  37.  
  38.     for(n=0; n<len; n++) 
  39.     { 
  40.         tmp = a[n]; 
  41.         left = 0; 
  42.         right = n-1; 
  43.  
  44.         while(left <= right) 
  45.         { 
  46.             mid = (right + left) / 2; 
  47.             if(a[mid] > a[n]) 
  48.                 right = mid - 1; 
  49.             else 
  50.                 left = mid + 1; 
  51.         } 
  52.          
  53.         for(k=n-1; k>=left; k--) a[k+1] = a[k]; 
  54.         a[left] = tmp; 
  55.     }    
  56.  
  57. //O(n1.25) 
  58. //unstable 
  59. void ShellInsertSort(int *a, int len) 
  60.     int gap = len; 
  61.     int x = 0; 
  62.     int n = 0; 
  63.     int tmp = 0; 
  64.     int m = 0; 
  65.  
  66.     while(1) 
  67.     { 
  68.         gap = (gap%2==0) ? gap/2 : (gap+1)/2; 
  69.          
  70.         for(x=0; x<gap; x++) 
  71.         { 
  72.             while(x+n*gap < len) 
  73.             { 
  74.                 if(n != 0) 
  75.                 { 
  76.                     tmp = a[x+n*gap]; 
  77.                     for(m=1; m<=n; m++) 
  78.                     { 
  79.                         if(tmp < a[x+(n-m)*gap]) 
  80.                         { 
  81.                             a[x+(n-m+1)*gap] = a[x+(n-m)*gap]; 
  82.                             if(m == n) a[x+(n-m)*gap] = tmp; 
  83.                         } 
  84.                         else 
  85.                         { 
  86.                             a[x+(n-m+1)*gap] = tmp; 
  87.                             break
  88.                         } 
  89.                     }                    
  90.                 } 
  91.                 n++; 
  92.             } 
  93.             n = 0; 
  94.         } 
  95.  
  96.         if(gap == 1) break
  97.     }    
  98.  
  99. //O(n2) : worst, O(n) : best 
  100. //stable 
  101. //swap flag 
  102. void BubbleSwapSort(int *a, int len) 
  103.     int n = 0; 
  104.     int m = 0; 
  105.     int tmp = 0; 
  106.     int swap = 0; 
  107.  
  108.     for(n=len-1; n>=0; n--) 
  109.     { 
  110.         for(m=1; m<=n; m++) 
  111.         { 
  112.             if(a[len-m-1] > a[len-m]) 
  113.             { 
  114.                 tmp = a[len-m]; 
  115.                 a[len-m] = a[len-m-1]; 
  116.                 a[len-m-1] = tmp; 
  117.                 swap = 1; 
  118.             }  
  119.         } 
  120.         if(swap == 0) 
  121.             break
  122.         else 
  123.             swap = 0; 
  124.     } 
  125.  
  126. //very good sort algorithm. 
  127. //O(nlogn) 
  128. //O(n2) : worst 
  129. //unstable 
  130. //when n is big, this algorithm is well-performed. when n is small or most 
  131. //element of the array is in order, it's worse than others. 
  132. void QuickSwapSort(int *a, int len) 
  133.     int tmp = 0; 
  134.     int x = 0; 
  135.     int n = 0; 
  136.     int off = 1; 
  137.  
  138.     if(len<=1) return
  139.     if(len==2 && a[0] > a[1]) 
  140.     { 
  141.         tmp = a[1]; 
  142.         a[1] = a[0]; 
  143.         a[0] = tmp; 
  144.     } 
  145.  
  146.     x = a[0]; 
  147.      
  148.     for(n=1; n<len; n++) 
  149.     { 
  150.         if(a[n] < x) 
  151.         { 
  152.             if(n!=off) 
  153.             { 
  154.                 tmp = a[n]; 
  155.                 a[n] = a[off]; 
  156.                 a[off] = tmp; 
  157.             } 
  158.             off++; 
  159.         } 
  160.     } 
  161.      
  162.     tmp = a[off-1]; 
  163.     a[off-1] = a[0]; 
  164.     a[0] = tmp; 
  165.  
  166.     QuickSwapSort(a,off-1); 
  167.     QuickSwapSort(&a[off],len-off); 
  168.  
  169. //O(n2) 
  170. //unstable 
  171. //this algorithm did not use the intermediate result 
  172. void DirectSelectSort(int *a, int len) 
  173.     int n = 0; 
  174.     int m = 0; 
  175.  
  176.     int min = 999; 
  177.     int min_pos = -1; 
  178.  
  179.     int tmp = 0; 
  180.  
  181.     for(n=0; n<len; n++) 
  182.     { 
  183.         for(m=n; m<len; m++) 
  184.         { 
  185.             if(a[m] < min) 
  186.             { 
  187.                 min = a[m]; 
  188.                 min_pos = m; 
  189.             }            
  190.         } 
  191.  
  192.         if(min_pos != n && min_pos != -1) 
  193.         { 
  194.             tmp = a[n]; 
  195.             a[n] = a[min_pos]; 
  196.             a[min_pos] = tmp; 
  197.         } 
  198.  
  199.         min = 999; 
  200.         min_pos = -1; 
  201.     } 
  202.  
  203. #include <iostream> 
  204. #include <bitset> 
  205. #include <memory> 
  206.  
  207. using namespace std; 
  208.  
  209. #define LV 4 
  210. #define LV1 8 
  211. #define NUM 16 
  212.  
  213. class Node 
  214. public
  215.     int d; 
  216.     int p; 
  217.  
  218.     Node() 
  219.     { 
  220.         d = -1; 
  221.         p = -1; 
  222.     }    
  223.          
  224.     void reset() 
  225.     { 
  226.         d = -1; 
  227.         p = -1; 
  228.     } 
  229.  
  230.     void set(int _d, int _p) 
  231.     { 
  232.         d = _d; 
  233.         p = _p; 
  234.     } 
  235.      
  236.     const Node& operator = (const Node &node) 
  237.     { 
  238.         d = node.d; 
  239.         p = node.p; 
  240.  
  241.         return *this
  242.     } 
  243. }; 
  244.  
  245. int cal(Node *arr1, int n1) 
  246.     bitset<LV> bs1 = n1; 
  247.     bs1 <<= 1; 
  248.     int m1 = (int)bs1.to_ulong(); 
  249.  
  250.     if(arr1[m1].d == -1 && arr1[m1+1].d == -1) 
  251.         arr1[n1].reset(); 
  252.     else if(arr1[m1].d == -1) 
  253.         arr1[n1] = arr1[m1+1]; 
  254.     else if(arr1[m1+1].d == -1) 
  255.         arr1[n1] = arr1[m1]; 
  256.     else 
  257.         if(arr1[m1].d <= arr1[m1+1].d) 
  258.             arr1[n1] = arr1[m1]; 
  259.         else 
  260.             arr1[n1] = arr1[m1+1]; 
  261.          
  262.     bs1 = n1; 
  263.     bs1 >>= 1; 
  264.     bs1.set(bs1.size()-1); 
  265.  
  266.     return (int)bs1.to_ulong(); 
  267.  
  268. //O(nlogn) better DirectSelectSort 
  269. //stable
  270. void TournamentSort(int *a, int len) 
  271.     int n = 0; 
  272.     int m = 0; 
  273.  
  274.     Node *arr = new Node[NUM-1]; 
  275.  
  276.     for(n=0; n<len; n++) 
  277.         arr[n].set(a[n],n); 
  278.  
  279.     for(n=LV1; n<NUM-1; n++) 
  280.         cal(arr,n); 
  281.  
  282.     for(n=0; n<len; n++) 
  283.     { 
  284.         a[n] = arr[NUM-2].d; 
  285.         m = arr[NUM-2].p;        
  286.         arr[m].reset(); 
  287.  
  288.         bitset<LV> bs = m; 
  289.         bs >>= 1; 
  290.         bs.set(bs.size()-1); 
  291.         m = (int)bs.to_ulong();  
  292.  
  293.         while(m<=NUM-2) 
  294.             m = cal(arr, m); 
  295.     } 
  296.  
  297.     delete[] arr; 
  298.  
  299. int main(int argc, char* argv[]) 
  300.     int n = 0; 
  301.     int a[LEN] = {21,25,49,25,16,8}; 
  302.  
  303.     //DirectInsertSort(a, LEN);  //直接插入排序
  304.     //BinaryInsertSort(a, LEN);  //折半插入排序
  305.     //ShellInsertSort(a, LEN);   //希爾排序
  306.     //BubbleSwapSort(a, LEN);  //冒泡排序
  307.     //QuickSwapSort(a, LEN);     //快速排序
  308.     //DirectSelectSort(a, LEN);  //直接選擇排序
  309.     //TournamentSort(a, LEN);  //錦標賽排序
  310.  
  311.     for(n=0; n<LEN; n++) 
  312.         printf("%d ", a[n]); 
  313.  
  314.     printf("\n"); 
  315.  
  316.     return 0; 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章