1. 程式人生 > >排序--ShellSort 希爾排序

排序--ShellSort 希爾排序

logs 如果 github str close blob www. 部分 什麽

  希爾排序 no 實現

  希爾排序其實就是插入排序。只不過希爾排序在比較的元素的間隔不是1。 我們知道插入排序 都是 一個一個和之前的元素比較。發現比之前元素小就交換位置。但是希爾排序可能是和前第n個元素比較,如果發現比前第n個元素小就和前第n個元素交換位置。具體看下圖

    技術分享

  第一趟比較。n是為5。也就是說每個數和前面第5個數比較。如果發現小於前面第5個數的話。交換位置。

  所以我們看到 72 比 592 小。 所以交換位置。 283 比 348 小。繼續交換

  第二趟比較。 n 是2。同理

  最後一次比較。n是1 ,註意這個時候就是插入排序了。

  這個 5 2 1 這種增量數字的選擇到底是基於什麽來選擇的。其實我也不知道,一般的數字都可以,只不過性能不一定那麽快。還有比如說4 排序了。 2 再排序的話 性能就會差一些。因為相對於4已經排序了的數組。已經有一部分的數組已經排好序了。

  這裏給出幾個比較快的 排序增量的sequence

  

技術分享
    //Sedgewick 增量序列的最壞時間復雜度為 O(N4/3);平均時間復雜度約為 O(N7/6)。
    //hi=max(9?4^n?9?2^n+1, 2^(n + 2) * (2^(n + 2) - 3)) + 1
    //5 是由N = 0 得出來的
    //28
    private static int INCREMENT_SEQUENCE_SEDGEWICK[] = {
            1,5,19,41,109,209,505,929,
            2161,3905,8929,16001,36289,64769,146305,260609,
            
587521,1045505,2354689,4188161,9427969,16764929,37730305,67084289, 150958081,268386305,603906049,1073643521};
INCREMENT_SEQUENCE_SEDGEWICK

技術分享
    //Knuth  sequence 3N + 1 , N 是之前的元素
    //O(n^1.5)
    //20
    int INCREMENT_SEQUENCE_KNUTH[] = {
            1,4,13,40,121,364,1093,3280,
            9841,29524,88573,265720,797161,2391484,7174453,21523360,
            
64570081,193710244,581130733,1743392200};
INCREMENT_SEQUENCE_KNUTH

  具體的實現可以在這裏看到 ->>>>>>https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/sort/ShellSort.java

  這裏還有關於什麽shell排序很快的原因https://www.zhihu.com/question/24637339

  Sedgewick 增量序列的ShellSort 最壞時間復雜度為 O(N4/3);平均時間復雜度約為 O(N7/6)

排序--ShellSort 希爾排序