希爾排序超詳解及其java實現
阿新 • • 發佈:2018-11-07
希爾排序雖然已經十分古老了,但其思想確實十分值得我們學習,非常的巧妙
雖然很多資料說希爾排序是叫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]