什麼是堆
- 堆是一個完全二叉樹
tips:完全二叉樹的特徵是除最後一層,其他層的節點個數都是滿的,最後一層的節點都靠左排列
- 堆中每一個節點的值都必須大於等於(或小於等於)其子樹中每個節點的值
- 大頂堆
- 小頂堆
如何實現一個堆
- 如何存儲一個堆
數組存儲,.....數組存儲的優勢?
- 堆支持哪些操作?
2.1 往堆裏插入一個元素
插入元素後,需繼續滿足堆的兩個特性,這其中就有個堆化(heapify)的過程
堆化方向:從下往上、從上往下
堆化過程:順着節點所在的路徑,從下或者從上,對比,然後交互
2.2 刪除堆頂元素
往堆中插入一個元素和刪除堆頂元素的時間複雜度都是O(log n)
如何基於堆實現排序?
堆排序,時間複雜度O(n log n),原地排序算法
- 建堆
從後往前處理數組,每個數據都是從上往下堆化,建堆的時間複雜度O(n) - 排序
移除堆頂元素,把下標爲n的元素放堆頂,再通過堆化的方法,將剩下的n-1個元素重新構建成堆。
堆排序的時間複雜度是O(n log n)
爲什麼快速排序要比堆排序性能好?
- 堆排序數據訪問的方式沒有快速排序友好
- 同樣數據,排序過程中,堆排序算法的數據交換次數要多於快速排序