希爾排序又稱「縮小增量排序」。它的基本思想以下:算法
先將整個待排記錄序列分紅若干個子序列分別進行直接插入排序,等到整個序列中的記錄「基本有序」了,再對全體記錄進行一次直接插入排序。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。希爾排序方法是一個不穩定的排序方法。排序