希爾排序

希爾排序又稱「縮小增量排序」。它的基本思想以下:算法

先將整個待排記錄序列分紅若干個子序列分別進行直接插入排序,等到整個序列中的記錄「基本有序」了,再對全體記錄進行一次直接插入排序。shell

算法實現:spa

咱們這裏簡單處理增量序列:增量序列d={n/2,n/4,n/8....1}n爲要排序數的個數。code

即:先將要排序的一組記錄,按照某個增量d分紅若干組子序列,每組中記錄的下標相差d.對每組中的所有元素進行直接插入排序,而後再用一個較小的增量(d/2)對它進行分組,再每組中進行直接插入排序。接二連三縮小增量直至爲1,最後使用直接插入排序完成排序。blog

 1 void shellSort(int a[],int n)
 2 {
 3     int d=n/2;
 4     while(d>=1)
 5     {
 6         ShellInsertSort(a,n,d);
 7         d=d/2;
 8     }
 9 }
10 
11 void ShellInsertSort(int a[],int n,int d)
12 {
13     for(int i=d;i<n;i++)
14     {
15         if(a[i]<a[i-d])
16         {
17             int j=i-d;
18             int x=a[i];
19             a[i]=a[i-d];
20             while(x<a[j])
21             {
22                 a[j+d]=d[j]
23                 j=j-d;
24             }
25             a[j+d]=x;
26         }
27     }
28 }

希爾排序時效分析很難,關鍵碼的比較次數與記錄移動次數依賴於增量因子序列d的選取,特定狀況下能夠準確估算出關鍵碼的比較次數和記錄的移動次數。目前尚未人給出選取最好的增量因子序列的方法。增量因子序列能夠有各類取法,有取奇數的,也有取質數的,但須要注意:增量因子中除1 外沒有公因子,且最後一個增量因子必須爲1。希爾排序方法是一個不穩定的排序方法。排序

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息