希爾排序

希爾排序是對插入排序的一種改進,要想理解希爾排序必須先理解插入排序,希爾排序與插入排序的區別就是,希爾排序每次移動指針的距離不是固定每次只移動一個單位距離。可以想象一下,假設有一萬個數據來排序,前9999個都已經排好了發現第10000個數據值相當小,如果它剛好是這個數據的最小值的話,他們它將會跟它前面的9999個數據依次的比較,然後再慢慢的移動,最後再排到第一個,這10000個數據還算少的,假如更多呢?計算機遇到這種情況,只能按照特定的算法愚蠢的執行,所以說插入法是一個不穩定的算法,而希爾排序就是對插入法的一種改進,是一個穩定的排序算法,希爾排序不要求一趟就把所有順序都排好而是分很多趟完成的。它第一趟排序過程中指針一次移動的距離可以很大,然後到第二趟,第三趟....再慢慢縮短指針一次移動的距離,這樣就可以保證,整個數列整體上是一個相對比較順序的數列,只是局部順序是亂的,這樣就不會出現插入法那種到後面一個值要移動很遠的距離的情況了。至於指針一次移動多少距離,是有一個固定的公式來計算的,代碼如下:

public static void sort(int[] arr){
		int h=1;
		//初始化間隔,確定初始的移動距離
		while(h<arr.length/3){
			h=h*3+1;
		}
		while(h>=1){
			for(int i=h;i<arr.length;i++){
				int t=arr[i];
				int j=i-h;
				while(j>=h-1&&arr[j]>t){
					arr[j+h]=arr[j];
					j-=h;
				}
				arr[j+h]=t;
			}
			h=(h-1)/3;//每完成一趟排序,按照公式縮短移動距離
		}
	}


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