1、堆
- 堆是一個完全二叉樹;
- 堆中每一個節點的值都必須大於等於(或小於等於)其子樹中每個節點的值。
1.1 堆的實現
完全二叉樹比較適合用數組來存儲!
1.1 插入元素
往堆中插入一個元素後,需要繼續滿足堆的兩個特性。 如果我們把新插入的元素放到堆的最後 ,可能不滿足第二個特效,需要進行堆化。
堆化非常簡單,就是順着節點所在的路徑,向上或者向下,對比,然後交換。
1.2 刪除堆頂元素
從堆的定義的第二條中,任何節點的值都大於等於(或小於等於)子樹節點的值,我們可以發現,堆頂元素存儲的就是堆中數據的最大值或者最小值 。
把最後一個節點放到堆頂,然後利用同樣的父子節點對比方法。對於不滿足父子節點大小關係的,互換兩個節點,並且重複進行這個過程,直到父子節點之間滿足大小關係爲止。
2、堆排序
藉助於堆這種數據結構實現的排序算法,就叫作堆排序。
時間複雜度非常穩定,是O(nlogn),並且它還是原地排序算法。
具體實現參考堆排序
3、堆應用
3.1 優先級隊列
優先級隊列,隊列最大的特性就是先進先出,在優先級隊列中,數據的出隊順序不是先進先出,而是按照優先級來,優先級最高的,最先出隊 。
往優先級隊列中插入一個元素,就相當於往堆中插入一個元素;從優先級隊列中取出優先級最高的元素,就相當於取出堆頂元素。
3.2 利用堆求 Top K
3.3 利用堆求中位數
具體實現參考堆應用