算法學習筆記之希爾排序

一、概述

希爾排序是插入排序的一種,又稱“縮小增量排序”,是插入排序算法的一種更高效的改進版本。

二、需求:

排序前:{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並沒有固定規則,有很多論文研究了各種不同的遞歸增序列,但都無法證明某個序列的時間複雜度分析。
我們可以採用事後分析法對希爾排序和插入排序做性能比較。

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