本篇文章主要基於演算法algorithm第四版
背景:處理有序元素時,不一定要求所有資料有序,只要求處理當前最大(優先順序最高)的元素
優先順序佇列:支援 刪除最大元素 和 插入元素 兩種操作的一種資料結構
優先順序佇列的基本實現可以使用 有序 或 無序 的陣列和鍊錶
基於陣列或鍊錶的操作最壞情況下需線性時間完成,而用堆來實現優先順序佇列可以使兩種操作更快執行
因為二叉堆是完全二叉樹,所以只用陣列就可以表示,在二叉堆中位置為k的父結點的位置為ceil(k/2),而子結點為2k和2k+1,這樣方便的表示也使其能通過陣列索引方便地上下移動元素
在插入或刪除堆中元素時,會打破堆的狀態,所有需要對堆進行遍歷來恢復堆的狀態(堆有序 以及 完全二叉樹),這個過程稱為堆的有序化。有序化過程主要分為兩類:
通過有序化的兩個過程我們便可實現插入元素以及刪除最大元素的操作
插入元素:將新元素加到陣列末尾,增加堆的大小並讓這個新元素 上浮 到合適的位置
刪除最大元素:從陣列刪去最大的元素並將最後乙個元素放到堆頂,減小堆的大小,並讓該元素 下沉 到合適的位置
優先佇列可以變成一種排序方法,將所有元素插入乙個查詢最小元素 的優先佇列,然後再重複呼叫刪除最小元素的操作來將他們按順序刪去。以此方法來實現排序。
在進行堆排序時,首先要將一組無序資料建立起堆,然後再重複刪去最大(或小)元素
這一階段完成排序工作。從堆中刪除最大元素,然後放入堆縮小後陣列中空出的位置,將堆尾元素放到堆頂,進行下沉操作。以此方法重複,則乙個最大堆可以得到乙個公升序序列。
本人學識尚淺,有什麼不對的歡迎指出,一起交流交流^ ^
堆與優先順序佇列
最大值堆 max heap 的性質是任意乙個結點的值都大於或者等於其任意乙個子結點儲存的值。由於根結點包含大於或等於其子結點的值,而其子結點又依次大於或者等於各自結點的值,所以根結點儲存著該樹的所有結點中的最大值。最小值堆 min heap 的性質是任意乙個結點的值都小於或者等於其子結點儲存的值。無...
堆(優先順序佇列)
c 的 stl 中提供了 優先佇列 這一容器,它和普通的 fifo 佇列都定義在 中,有 push 和 pop 過程,分別表示 往佇列裡加入新元素 和 從佇列裡刪除隊首元素 唯一的區別是,在優先佇列中,元素並不是按照進入佇列的先後順序排列,而是按照優先順序的高低順序排列 換句話說,pop 刪除的是優...
堆 優先順序佇列
1一般二叉樹的順序儲存 層序遍歷方式 使用陣列儲存二叉樹結構,即將二叉樹 按照層序遍歷 的方式放入陣列.這種方式一般只適用於完全二叉樹,一般的二叉樹會造成空間浪費比較嚴重.2堆 heap 在邏輯上就是乙個 完全二叉樹,在物理上儲存在 陣列 中.1 滿足任意結點的值都大於其子樹的結點的值.叫做大堆,反...