簡單點說:將元素進行分組,每組在進行組內的插入排序,在從新分組、排序。直到最後所有元素歸爲一組,作最後一次插入排序
注意:將待排元素分爲gap組(gap=gap/3+1),開始gap=array.length。每一組元素也不是位置連續的,
而是把每組中的第一個元素連續放在一塊兒,夠gap個後在放每一組的第二個元素。shell
1.第一組:無序區間第一個數key=array[4]=2ide
2.第二組:無序區間第一個數key=array[5]=4
3.第三組:無序區間第一數key=array[6]=1
4.第四組:無序區間第一個數key=array[7]=53d
5.再接着從第一組的無序區間的第二個元素key=array[8]=2開始
直到key第一輪走徹底程,第一輪結束的結果code
在會分新的組,gap=gap/3+1=4/3+1=2.分爲兩組
6.從新分爲兩組後
再重複以上比較移動交換的操做,完成第二次每組的排序
8.走到最後再分組gap=2/3+1=1組
最終比較完成後結果:blog
//希爾排序 public static void shellSort(int[] array) { int gap = array.length;//分組的個數 while (true) { gap = gap / 3 + 1; insertSortWithGap(array, gap);//分組的插入排序 if (gap == 1) { return; } } } //每組的組內插入排序 private static void insertSortWithGap(int[] array, int gap) { for (int i = 0; i < array.length - gap; i++) {//假設前gap組已經有序,因此只循環arr.length-gap次 int key = array[i + gap];//組內排序 int j; for (j = i; j >= 0 && key < array[j]; j -= gap) { array[j + gap] = array[j]; } array[j + gap] = key; } }