Java中的七大排序_2 希爾排序

希爾排序

簡單點說:將元素進行分組,每組在進行組內的插入排序,在從新分組、排序。直到最後所有元素歸爲一組,作最後一次插入排序
注意:將待排元素分爲gap組(gap=gap/3+1),開始gap=array.length。每一組元素也不是位置連續的,
而是把每組中的第一個元素連續放在一塊兒,夠gap個後在放每一組的第二個元素。
Java中的七大排序_2 希爾排序shell

1.第一組:無序區間第一個數key=array[4]=2
Java中的七大排序_2 希爾排序ide

2.第二組:無序區間第一個數key=array[5]=4
Java中的七大排序_2 希爾排序
3.第三組:無序區間第一數key=array[6]=1
Java中的七大排序_2 希爾排序
4.第四組:無序區間第一個數key=array[7]=5
Java中的七大排序_2 希爾排序3d

5.再接着從第一組的無序區間的第二個元素key=array[8]=2開始
直到key第一輪走徹底程,第一輪結束的結果
Java中的七大排序_2 希爾排序code

在會分新的組,gap=gap/3+1=4/3+1=2.分爲兩組
6.從新分爲兩組後
Java中的七大排序_2 希爾排序
再重複以上比較移動交換的操做,完成第二次每組的排序
8.走到最後再分組gap=2/3+1=1組
Java中的七大排序_2 希爾排序
最終比較完成後結果:
Java中的七大排序_2 希爾排序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;
        }
    }
相關文章
相關標籤/搜索