HeapSort 堆排序

殷老實發表於2016-11-10

堆排序 - Heap Sort, 它和Merge Sort - 歸併排序很像,但是不同於Insertion Sort - 插入排序,因為它的執行時間為 O(nlogn). 可是它又和Insertion Sort很類似,但是不同於Merge Sort, 因為它是In Place的。

綜上所述,heap sort是整合了insertion sort 和 merge sort的優點的演算法即 In Place的執行時間為 O(nlogn) 的排序演算法。


1. 使用的資料結構

     heap sort使用的是陣列資料結構進行操作,但是為了更好的理解我們將資料轉化成二叉樹 。如下圖


2. 兩種不同屬性的heap sort, 一種是max-heap 如上圖,任意根節點的值都大於它的左孩子和右孩子。另一種是min-heap, 任意根節點的值都小於它的左孩子和右孩子。


3. 如何保持heap sort中heap的max-heap或者min-heap的這種屬性呢?

 (以max-heap作為例子)採用 max-heapify 操作。如下圖,

 

4. max-heapify 是什麼原理呢? 

 max-heapify 是一個方法, 這個方法的輸入是兩個變數 max-heapify(int[] array, int index). 做的就是一件事即 從輸入的index開始使從該index為起點的較大值的子樹滿足max-heap屬性。

如上圖中, 對應的輸入為 max-heapify (Array, 1). 就是從 節點 4開始, 使節點4以及它的子樹滿足max-heap屬性。


5. 為什麼要使用max-heapify?

 max-heapify是為build-max-heap做準備的,因為max-heapify只是對二叉樹的中單個點進行操作使其滿足max-heap屬性,而build-max-heapify就是對整體的樹進行max-heapify使整體滿足max-heap屬性。 注意的是當我們進行build-max-heapify的時候,我們不必從最後一個節點開始, 我們可以從中間節點開始, 因為中間節點之後的節點都是中間節點之前節點的孩子。 

6. build-max-heapify 會有什麼好處?

  當在5中我們完成了build-max-heapify之後, 我們得出一個二叉樹,該二叉樹有一個很重要的性質:第一個節點是最大值!並且二叉樹中的所有節點滿足max-heap原則, 而且最後一個節點也肯定是一個較小值. 我們可以使用這些性質完成 heap sort 演算法 即 每次把第一個節點和最後一個節點進行互換,互換之後對第一個節點進行max-heapify處理.  如下圖

            

7. HeapSort演算法的應用

  PriorityQueue 就是一個對heap sort 的很好的實現。

程式碼使用Java 實現: GitHub - HeapSort  (演算法實現中的heap_size 指的是: 我們想要做操作的對應的陣列大小!)


有問題歡迎指出!


相關文章