希爾排序法(Shell Sort)屬於插入類排序,又稱為縮小增量排序。它對直接插入排序有了很大的改進,是直接插入排序的增強版。

希爾排序的基本思想是:

把線性表按步長gap分組,共有gap個組。

每組線性表中有arr.length/gap個元素,每個元素相鄰gap。接下來對每組線性表採用直接插入排序方法進行排序。

隨著步長逐漸減小,所分成的組包含的元素越來越多,當步長的值減小到 1 時,整個資料合成為一組,構成一組有序記錄,則完成排序。


下圖是本人對希爾排序思想所做的圖示:


步長gap的選擇決定著希爾排序的最終效率。只要最終步長為1任何步長序列都可以工作(且步長要小於陣列長度)。演算法最開始以一定的步長進行排序。隨著步長gap的逐漸減小,繼續以一定步長進行排序,最終演算法以步長為1進行排序。當步長為1時,演算法變為插入排序,這就保證了資料一定會被排序。

希爾排序的時間複雜度,與步長的關係如下圖:


java程式碼如下:

public class ShellSort {

	public static void main(String[] args) {
		// TODO 自動生成的方法存根
		int arr[] = {4,9,2,3,5,10,8,6,1};
		shellsort(arr);
		for(int a : arr)
			System.out.print(a+" ");
	}
	
	public static void shellsort(int arr[]){
		//逐漸縮小步長。此處gap以每次除以2進行減少
		for(int gap = arr.length/2 ; gap >=1 ; gap /= 2){ //gap為步長
			//直接排序法
			for(int i = gap ; i < arr.length ; i++){
				int temp = arr[i];
				while( i-gap >= 0 && arr[i-gap] > temp){
					arr[i] = arr[i-gap];
					i = i-gap;
				}
				arr[i] = temp;
			}
		}
	}
}