一、概述
希爾排序是插入排序的一種,又稱“縮小增量排序”,是插入排序算法的一種更高效的改進版本。
二、需求:
排序前:{9,1,2,5,7,4,8,6,3,5}
排序後:{1,2,3,4,5,5,6,7,8,9}
三、排序原理
1.選定一個增長量h,按照增長量h作爲數據分組的依據,對數據進行分組;
2.對分好的每一組數據完成插入排序;
3.減少增長量,量小減爲1,重複第二步操作。
增長量h的確定:增長量h的值每一固定的規則如下:
int h=1;
while(h<5){
h=2h+1;
}
//循環結束後我們就可以確定h的最大值
//h的減小規則爲:
h=h/2;
希爾排序的API設計:
構造方法 | shell |
---|---|
成員方法 | 1.public static void sort(Comparable[] a):對數組內的元素進行排序 2.private static boolean greater(Comparable v,Comparable w):判斷v是否大於w 3.private static void exch(Comparable[] a,int i,int j):交換a數組中,索引i和索引j處的值 |
public static void sort(Comparable[] a){
//根據數組a的長度,確定增長量h的初始值
int h = 1;
while(h<a.length/2){
h=2*h+1;
}
//希爾排序
while(h>=1){
//排序
//找到插入排序的元素
for(int i=h;i<a.length;i++){
//把待插入的元素插入到有序數列中
for(int j=i;j>=h;j-=h){
//待插入的元素a[j],比較a[j]和a[j-h]
if(greater(a[j-h],a[j]){
//交換元素
exch(a,j-h,j);
}else{
break;
}
}
//較小h的值
h=h/2;
}
}
}
四、希爾排序的時間複雜度分析
1.概述
在希爾排序中,增長量h並沒有固定規則,有很多論文研究了各種不同的遞歸增序列,但都無法證明某個序列的時間複雜度分析。
我們可以採用事後分析法對希爾排序和插入排序做性能比較。