(C語言)八大排序之:希爾排序

reference: https://www.cnblogs.com/chengxiao/p/6104371.html

插入排序,是穩定的。

希爾排序,是不穩定的。

       一次插入排序是穩定的,不會改變相同元素的相對順序。希爾排序需要多次插入排序,值相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂,所以shell排序是不穩定的。

        希爾排序,又稱縮小增量排序,是直接插入排序算法的一種更高效的改進版本:增量gap,使元素的移動是跳躍式的,較少了元素移動的次數。

  1 #include <stdio.h>
  2 
  3 void insertSort(int a[], int len);
  4 void shellSort(int a[], int len);
  5 void display(int a[], int len);
  6 
  7 int main(int argc, char *argv)
  8 {
  9         int a[] = {2,6,7,2,5,9,0};
 10         int len = sizeof(a)/sizeof(a[0]);
 11 
 12         //insertSort(a, len);   // 插入排序
 13         shellSort(a, len);      // 希爾排序
 14 
 15         display(a, len);
 16         return 0;
 17 }
 18 
 19 // 插入排序:當前值與其前面的值比較,大於當前值的部分整體後移,
 20 // 再將當前值插入正確的位置
 21 void insertSort(int a[], int len)
 22 {
 23         int i;
 24         for(i=1; i<len; i++)
 25         {
 26                 int j = i;
 27                 int temp = a[i];
 28                 while(j-1>=0 && temp<a[j-1])
 29                 {
 30                         a[j] = a[j-1];
 31                         j--;
 32                 }
 33                 a[j] = temp;
 34         }
 35 }
 36 
 37 // 希爾排序、縮小增量排序
 38 // 按下標的設定增量gap來分組,對每組使用insertSort
 39 // 代碼實現時可以不用按組處理,可以逐個跨組處理
 40 void shellSort(int a[], int len)
 41 {
 42         int gap;
 43         for(gap=len/2; gap>=1; gap=gap/2)
 44         {
 45                 int i;
 46                 for(i=gap; i<len; i++)
 47                 {
 48                         int j = i;
 49                         int temp = a[i];
 50                         while(j-gap>=0 && temp<a[j-gap])
 51                         {
 52                                 a[j] = a[j-gap];
 53                                 j = j-gap;
 54                         }
 55                         a[j] = temp;
 56                 }
 57         }
 58 }
 59 
 60 void display(int a[], int len)
 61 {
 62         int i;
 63         for(i=0; i<len; i++)
 64                 printf("%d ", a[i]);
 65         printf("\n");
 66 }


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