(一)希爾排序算法
希爾排序是希爾(Donald Shell)於1959年提出的一種排序算法。希爾排序也是一種插入排序,它是簡單插入排序通過改進以後的一個更高效的版本,也稱爲縮小增量排序,同時該算法是衝破O(n2)的第一批算法之一。它與插入排序的不一樣之處在於,它會優先比較距離較遠的元素。希爾排序又叫縮小增量排序。數組
希爾排序是把記錄按下表的必定增量分組,對每組使用直接插入排序算法排序;隨着增量逐漸減小,每組包含的關鍵詞愈來愈多,當增量減至1時,整個數組被分紅一組,算法便終止。app
1.算法描述:ide
咱們選擇增量gap=length/2,縮小增量繼續以gap = gap/2的方式,這種增量選擇咱們能夠用一個序列來表示,{n/2,(n/2)/2...1},稱爲增量序列。希爾排序的增量序列的選擇與證實是個數學難題,咱們選擇的這個增量序列是比較經常使用的,也是希爾建議的增量,稱爲希爾增量,但其實這個增量序列不是最優的。此處咱們作示例使用希爾增量。ui
(1)選擇一個增量序列t1,t2,…,tk,其中ti>tj,tk=1;spa
(2)按增量序列個數k,對序列進行k 趟排序;code
(3)每趟排序,根據對應的增量ti,將待排序列分割成若干長度爲m 的子序列,分別對各子表進行直接插入排序。僅增量因子爲1 時,整個序列做爲一個表來處理,表長度即爲整個序列的長度。blog
2.手動模擬排序:排序
(二)代碼實現數學
public class ShellSort { public static void main(String[] args) { int[] arr = {3,4,1,2,7,8,6,5,9}; Shell(arr);//排序 System.out.println("-----------------------------------------"); print(arr);//打印結果 } private static void Shell(int[] arr) { if(arr == null || arr.length <= 1){ return; } int gap = arr.length / 2; while (gap >= 1){ //組間進行插入排序 for (int i = 1; i < arr.length; i++) { int current = arr[i]; int preIndex = i - gap; for (; preIndex >= 0 && arr[preIndex] > current; preIndex = preIndex - gap) { arr[preIndex + gap] = arr[preIndex]; } arr[preIndex + gap] = current; } //打印每次分組排序後的結果 print(arr); //縮小增量 gap /= 2; } } public static void print(int[] arr){ StringBuilder sb = new StringBuilder("["); for (int i = 0; i < arr.length; i++) { sb.append(arr[i]); if(i != arr.length - 1){ sb.append(", "); } } System.out.println(sb.append("]")); } }