1. 程式人生 > 實用技巧 >排序演算法之希爾排序

排序演算法之希爾排序

參考:https://www.runoob.com/w3cnote_genre/algorithm

希爾排序

選擇一個增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;
按增量序列個數 k,對序列進行 k 趟排序;
每趟排序,根據對應的增量 ti,將待排序列分割成若干長度為 m 的子序列,分別對各子表進行直接插入排序。僅增量因子為 1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。

1、宣告一個變數gap,初始值為1
2、對gap進行迴圈,取到一個滿足小於陣列長度,且比3的倍數多1條件的最大值。
3、迴圈條件為gap大於0
4、宣告一個迴圈變數i,初始值為gap,小於陣列長度
5、宣告一個臨時變數,賦值為陣列下標為i的元素
6、宣告一個迴圈變數j,賦值為i-gap
7、判斷條件:j>0且陣列下標為j的元素大於tmp,不滿足則跳過下一步
8、將陣列下標為j的元素賦值給陣列下標為j+gap,並將j-gap賦值給j
9、將tmp賦值給陣列下標為j+gap
10、將gap除以3並向下取整賦值給gap
11、重複第三至第十步

public int[] sort(int[] sourceArray) throws Exception {
    // 對 arr 進行拷貝,不改變引數內容
    int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
    int gap = 1;
    while (gap < arr.length) {
        gap = gap * 3 + 1;
    }
    while (gap > 0) {
        for (int i = gap; i < arr.length; i++) {
            int tmp = arr[i];
            int j = i - gap;
            while (j >= 0 && arr[j] > tmp) {
                arr[j + gap] = arr[j];
                j -= gap;
            }
            arr[j + gap] = tmp;
        }
        gap = (int) Math.floor(gap / 3);
    }
    return arr;
}