冒泡,插入,折半插入,希爾,快速,簡單選擇排序源碼總結

  1. #include <iostream>  
  2. using namespace std;  
  3. //各種排序方法:  
  4. /**冒泡排序法**/  
  5. //它的時間複雜度爲O(n^2),雖然不及堆排序、快速排序的O(nlogn,底數爲2),但是有兩個優點:1.“編程複雜度”很低,很容易寫出代碼;2.具有穩定性,這裏的穩定性是指原序列中相同元素的相對順序仍然保持到排序後的序列,而堆排序、快速排序均不具有穩定性。  
  6. void Bubble_sort(int s[],int len){  
  7.     int i,j,flag;  
  8.     for (i=len-1; i>=1; i--) {  
  9.         flag=1;  
  10.         for (j=i-1; j>=0; j--) {  
  11.             if (s[i]<s[j]) {  
  12.                 swap(s[i], s[j]);  
  13.                 flag=0;  
  14.             }  
  15.         }  
  16.         if (1==flag) {//表示已經排序完成  
  17.             break;  
  18.         }  
  19.     }  
  20. }  
  21. /**插入排序法**/  
  22. //插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,算法適用於少量數據的排序,時間複雜度爲O(n^2)。是穩定的排序方法。  
  23. void Insert_sort(int s[],int len){   
  24.     int i,j;  
  25.     int temp;  
  26.     for(i=1;i<len;i++){  
  27.         temp=s[i];  
  28.         for (j=i; j>0&&temp<s[j-1]; j--) {  
  29.             s[j]=s[j-1];  
  30.         }  
  31.         s[j]=temp;  
  32.     }  
  33. }  
  34. /**折半插入排序法**/  
  35. //當第i個元素要進行排序的時候,它前面的1到i-1位置上的數據是局部有序的,對於有序的數據序列,採用折半查找法去判斷在何處插入i位置上的數據,就大大減少了需要比較的次數。  
  36. void HalfInsert_sort(int s[], int len){  
  37.     int temp, low, high, i, j, mid;  
  38.     for (i=1; i<len; ++i)  
  39.     {  
  40.         temp = s[i];  
  41.         low = 0;  
  42.         high = i - 1;  
  43.           
  44.         while (high >= low)  
  45.         {  
  46.             mid = (low + high) / 2;  
  47.               
  48.             if (temp < s[mid])  
  49.             {  
  50.                 high = mid - 1;  
  51.             }  
  52.               
  53.             else  
  54.             {  
  55.                 low = mid + 1;  
  56.             }  
  57.         }  
  58.           
  59.         for (j=i-1; j>=low; --j)  
  60.         {  
  61.             s[j+1] = s[j];  
  62.         }  
  63.           
  64.         s[low] = temp;  
  65.     }  
  66. }  
  67.   
  68. /**希爾排序法**/  
  69. //希爾排序法(縮小增量法) 屬於插入類排序,是將整個無序列分割成若干小的子序列分別進行插入排序的方法。  
  70. void Hill_sort(int s[],int len){  
  71.     int h,j,k,t;  
  72.     for (h=len/2; h>0; h=h/2) {//控制增量  
  73.         for (j=h;j<len; j++) {  
  74.             t=s[j];  
  75.             for (k=j-h; k>=0&&t<s[k]; k-=h) {  
  76.                 s[k+h]=s[k];  
  77.             }  
  78.             s[k+h]=t;  
  79.         }  
  80.     }  
  81. }  
  82.   
  83. /**快速排序法**/  
  84. //快速排序(Quicksort)是對冒泡排序的一種改進。通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。  
  85. //挖坑法  
  86. void quick_sort1(int s[],int l, int r){  
  87.     int i=l;  
  88.     int j=r;  
  89.     int x=s[i];//第一個坑  
  90.     if(i>=j) return ;  
  91.     while (i!=j) {  
  92.         //從右向左找小於x的數來填s[i];  
  93.         while (i<j&&s[j]>=x) {  
  94.             j--;  
  95.         }  
  96.         s[i]=s[j];  
  97.         //從左向右找大於或等於x的數來填s[j];  
  98.         while (i<j&&s[i]<x) {  
  99.             i++;  
  100.         }  
  101.         s[j]=s[i];  
  102.     }  
  103.     s[i]=x;  
  104.     quick_sort1(s, l, i-1);  
  105.     quick_sort1(s, i+1, j);   
  106. }  
  107. /**簡單選擇排序法**/  
  108. //選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小元素,然後放到排序序列末尾(目前已被排序的序列)。以此類推,直到所有元素均排序完畢。  
  109. void Select_sort(int s[], int len){  
  110.     int i,j,min;  
  111.     for (i=0; i<len-1; i++) {  
  112.         min=i;  
  113.         for (j=i+1; j<len; j++) 
  114.             if (s[min]>s[j])  
  115.                 min=j; //把值最小的下標記下來    
  116.         if (min!=i) 
  117.             swap(s[i], s[min]);     
  118.     }  
  119. }


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