此處默認二叉大根堆
描述:一棵樹,完全二叉(i的左孩子爲2i,右爲2i+1),對於每個節點,它的孩子鍵值小於它,優先隊列就是用堆實現的
性質:1.樹根爲最大點(堆頂),故不斷重複 取頂→刪頂就能得到排序序列(堆排序)
2.此結構決定了不能在裏面找任意元素(數組實現不服)或者迭代,(所以stl的優先隊列不能用這倆操作)
操作:1.基礎操作:節點的上浮與下沉:
上浮:一個節點,若其父親小於它,交換它和它父親,重複執行
下沉:一個節點,若其孩子大於它,交換它和它的值大的兒子,重複執行
聲明“最後一個節點”:最下層最右邊那個節點
2.插入節點:把這個點作爲最後一個節點插入,然後對他進行上浮
3.刪除節點:把最後一個節點的值賦到這個節點上並刪除最後那個節點,然後下沉(問題又回到了怎麼找這個節點上)
4.對一個數組建堆:將此數組看做數組實現的堆,從後向前一個個執行上浮的操作