[golang] 資料結構-希爾排序

來源:互聯網
上載者:User

除了上篇介紹的二分插入排序,還有這次介紹的希爾排序(Shell's Sort),也是對直接插入排序演算法的最佳化。

原理
希爾排序,就是按某個增量值對資料進行分組,每組單獨排序好後,再縮小這個增量,然後按新增量對資料分組後每個分組再各自排序。最終增加縮小到1的時候,排序結束。所以希爾排序又叫縮小增量排序(Diminishing Increment Sort)

關於增量
最佳增量值的選擇其實是個數學難題,有興趣的可以自己搜下相關資料。
常用的增量有 n/2(這個又叫希爾增量)、n/3、2^k-1(hibbard增量)等,實際使用中稍微改版增量也可能使排序的效能產生很大的波動。
比如使用n/2的增量,就是初始增量就是 length/2 ,第二輪分組時就再除2:length/4,直至增量值變成1

流程
假設有個數組:[8,12,6,33,12,5,4,94,63,23,75,22,43,27,46],以n/2為增量,那麼整個排序流程就是這樣的:

複雜度
不同增量複雜度不同。n/2時平均的時間複雜度為O(n^2)。
相較直接插入排序,希爾排序減少了比較和交換的次數,在中小規模的排序中,效能表現較好。但隨著資料量增大,希爾排序與其他更好的排序演算法(快排、堆排、並歸等)仍有較大差距。

代碼

package mainimport (    "fmt"    "time"    "math/rand")func main() {    var length = 15    var list []int    // 以時間戳記為種子產生隨機數,保證每次運行資料不重複    r := rand.New(rand.NewSource(time.Now().UnixNano()))    for i := 0; i < length; i++ {        list = append(list, int(r.Intn(1000)))    }    fmt.Println(list)    // 這裡就以n/2為增量z    gap := 2    step := length / gap    for step >= 1 {        // 這裡按步長開始每個分組的排序        for i := step; i < length; i++ {            // 將按步長分組的子隊列用直接插入排序演算法進行排序            insertionSortByStep(list, step)        }        // 完成一輪後再次縮小增量        step /= gap        // 輸出每輪縮小增量各組排序後的結果        fmt.Println(list)    }}// 這裡把上篇直接選擇排序的演算法抽出來,並將步長從1改成stepfunc insertionSortByStep(tree []int, step int) {    for i := step; i < len(tree); i++ {        for j := i; j >= step && tree[j] < tree[j-step]; j -= step {            tree[j], tree[j-step] = tree[j-step], tree[j]        }    }}

運行結果

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.