排序演算法之希爾排序
阿新 • • 發佈:2020-10-07
希爾排序
選擇一個增量序列 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; }