堆結構是一種陣列物件,是一棵完全二叉樹,
性質
若當前節點編號為i,父結點則為i/2,左孩子為2i,右孩子為2i+1,
堆的結點數\(\le\)陣列長度len
下圖為一個大根堆:每個結點均小于其父結點,樹根是堆中最大的結點,小根堆反之,

添加
往堆中添加一個元素,
重復n次添加操作,即可建立一個小根堆,
實作流程(以小根堆為例)
先在堆尾加入1個元素,并把這個結點置為當前結點,
比較當前結點和它的父結點的大小,
如果當前結點小于父結點,交換它們的值,把父結點置為當前結點,
重復以上程序,
如果當前結點大于等于父結點,結束,










取出堆頂
從堆中取出并洗掉一個元素,
實作流程(以小根堆為例)
取出根結點的值,
把堆的最后一個結點(len)放到根的位置上,把根覆寫掉,
把堆的長度減一,
把根結點置為當前結點,
如果當前節點無兒子(pa>len/2),結束,
否則,比較當前節點與其子節點的值,
如果當前節點的值小于等于其子節點,結束,
反之則交換這兩個結點的值,重復上述步驟,直至結束,


優先佇列
priority_queue<Type,Container,Functional>
Type是資料型別,Container是容器型別,
(Container必須是用陣列實作的容器,比如vector,deque等,但不能用list,STL里默認用vector)
Functional是比較函式,當需要用自定義的資料型別時才需要傳入這三個引數,使用基本資料型別時,只需要傳入資料型別,默認是大根堆,
頭檔案
include
定義小根堆
priority_queue<int,vector
定義大根堆
priority_queue<int,vector
基本操作
empty()
如果佇列為空,則回傳真,
pop()
洗掉隊頭元素,即洗掉第一個元素,
push()
加入一個元素,
size()
回傳優先佇列中擁有的元素個數,
top()
回傳優先佇列隊頭元素,即優先級最高的元素,
在默認的優先佇列中,優先級高的先出隊,
在默認的int型中先出隊的為較大的數,
堆排序



并非原創,僅是整理,請見諒
Lo問我為什么看星星,我覺得銀河和代碼是同一種東西,這也是一種回答,————Co轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/482111.html
標籤:C++
