1. 程式人生 > >希爾排序超詳解及其java實現

希爾排序超詳解及其java實現

希爾排序雖然已經十分古老了,但其思想確實十分值得我們學習,非常的巧妙

雖然很多資料說希爾排序是叫shell的人提出來的,我個人卻十分好奇,shell的英文好意為殼的意思,感覺希爾排序的思想就像一層層的殼一樣,從內到外越來越大,當然這是我胡謅的,具體原理如下(用的一個例項進行說明的):

原理:

以陣列{2,7,4,1,5,3,8,6,9,11,10}為例進行說明:

一般來說步長為除以2,有的人也選為除以3,思路都是一樣的

這裡的插入排序是如何實現的呢?插入排序的思路很簡簡單,這是在這裡的插入排序是存在步長的,除了最後步長為1時,是真正意義上的插入排序,思路如圖:

可能在步長很小的時候,比如1或者2時,會存在這樣的疑問,為什麼不選取下標最大的那個作為起點,實際上選取gap作為起點有不是好處,比如說,在i逐漸增加的過程中,實際上越往後,之前的子數列是有序的了,因為之前已經給其排序了的。如果還不明白,可以看下如下程式碼:

package order;

import java.util.Arrays;

public class shellSort {

	public static void shellSort_(int[] arr) {
		//步長
	for (int gap = arr.length/2; gap>0; gap/=2) {
		//start用於指定起點在下標gap處
		for (int start=gap; start< arr.length; start++) {
			int index=start-gap;
			for (; index>=0; index-=gap) {
				//比較大小
				if (arr[index]>arr[start]) {
					//交換
					int temp=arr[index+gap];
					arr[index+gap]=arr[index];
					arr[index]=temp;
				}else {
					break;
				}
			}
		}
		
	}
		
	}
		
	public static void main(String[] args) {
		int[] arr= {2,7,4,1,5,3,8,6,9,11,10};
		shellSort_(arr);
		System.out.println(Arrays.toString(arr));
	}
	
}

執行結果:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]