閱讀247 返回首頁    go 阿裏雲 go 技術社區[雲棲]


堆排序+代碼實現

堆排序

堆,heap,是二叉樹的一種。小根堆有這樣的性質——任意一個結點的值比它的左右孩子都要小。

排序思想

將待排元素看作是完全二叉樹,物理上用一維數組存儲。

實現堆排序需要解決兩個問題:

1.如何將雜亂的完全二叉樹初始化為一個堆?

答:從最後一個非葉結點起,將該節點當做根,自上而下進行調整,使之成為一個堆。然後依次對倒數第二個、倒數第三個、直至正數第一個結點進行此操作。

2.輸出堆頂元素後,如何將餘下的元素調整為一個堆?

答:將最後一個結點放在原根結點位置上,以它為根進行上述的調整。

複雜度分析。

二叉樹的層數計算方法,從上往下,1,2,3,4......

耗時的操作有構造初始堆和調整堆兩部分。

對深度為h的堆進行自上而下的調整,最多比較次數為2*(h-1)。

在初始化堆的過程中,完全二叉樹的高度為h,總的比較次數為


 

綜上,堆排序在複雜度最壞的情況下為O((1)式+(2)式)=O(n*logn)。


代碼

微笑初始序列為1 8 6 2 5 4 7 3一組數采用堆排序,當建堆(小根堆)完畢時,堆所對應的二叉樹中序遍曆序列為:(A

A8 3 2 5 1 6 4 7  B3 2 8 5 1 4 6 7  C3 8 2 5 1 6 7 4  D8 2 3 5 1 4 7 6


最後更新:2017-04-03 05:40:19

  上一篇:go 再論:p2p風控是p2p網站的核心——這又是一個文盲式屁話
  下一篇:go strtok:字符串分割函數