【數據結構與算法之美】堆和堆排序

什麼是堆

  1. 堆是一個完全二叉樹

tips:完全二叉樹的特徵是除最後一層,其他層的節點個數都是滿的,最後一層的節點都靠左排列

  1. 堆中每一個節點的值都必須大於等於(或小於等於)其子樹中每個節點的值
  • 大頂堆
  • 小頂堆

如何實現一個堆

  1. 如何存儲一個堆

數組存儲,.....數組存儲的優勢?

  1. 堆支持哪些操作?
    2.1 往堆裏插入一個元素
    插入元素後,需繼續滿足堆的兩個特性,這其中就有個堆化(heapify)的過程
    堆化方向:從下往上、從上往下
    堆化過程:順着節點所在的路徑,從下或者從上,對比,然後交互
    2.2 刪除堆頂元素

往堆中插入一個元素和刪除堆頂元素的時間複雜度都是O(log n)

如何基於堆實現排序?

堆排序,時間複雜度O(n log n),原地排序算法

  1. 建堆
    從後往前處理數組,每個數據都是從上往下堆化,建堆的時間複雜度O(n)
  2. 排序
    移除堆頂元素,把下標爲n的元素放堆頂,再通過堆化的方法,將剩下的n-1個元素重新構建成堆。
    堆排序的時間複雜度是O(n log n)

爲什麼快速排序要比堆排序性能好?

  1. 堆排序數據訪問的方式沒有快速排序友好
  2. 同樣數據,排序過程中,堆排序算法的數據交換次數要多於快速排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章