數組排序(4)- 希爾排序

(一)希爾排序算法

  希爾排序是希爾(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("]"));
    }
}
ShellSort
相關文章
相關標籤/搜索