HeapSort 堆排序
堆排序 - 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 指的是: 我們想要做操作的對應的陣列大小!)
有問題歡迎指出!
相關文章
- Java實現HEAPSORT堆排序演算法Java排序演算法
- 看懂堆排序——堆與堆排序(三)排序
- 堆排序排序
- js堆排序JS排序
- [JAVA]堆排序Java排序
- 堆排序詳解排序
- python 堆排序Python排序
- 堆排序 Heap Sort排序
- 堆排序(C++)排序C++
- 【筆記】堆排序筆記排序
- 實現堆排序排序
- 簡單堆排序排序
- js 實現堆排序JS排序
- 堆與堆排序(一)排序
- 堆排序(php實現)排序PHP
- 堆排序演算法排序演算法
- 堆操作與堆排序排序
- 堆排序(實現c++)排序C++
- 排序演算法__堆排序排序演算法
- 使用 Swift 實現堆排序Swift排序
- 順序表的堆排序排序
- 排序演算法-堆排序排序演算法
- 堆排序c++實現排序C++
- 排序演算法 - 堆排序排序演算法
- 每日一題(94) - 堆排序每日一題排序
- 【資料結構】堆排序資料結構排序
- 優先佇列和堆排序佇列排序
- 堆排序就這麼簡單排序
- 堆的基本操作及堆排序排序
- 圖解堆排序演算法圖解排序演算法
- 二叉堆及堆排序排序
- rust-algorithms:8-堆排序RustGo排序
- C#堆排序演算法C#排序演算法
- 堆排序與優先佇列排序佇列
- 演算法導論-堆排序演算法排序
- #排序演算法#【3】堆排序排序演算法
- 從零開始認識堆排序排序
- 堆排序和快速排序效能比較排序