最大、最小堆的实现
最大最小堆
堆是一種經過排序的完全二叉樹,其中任一非終端節點的數據值均不大于(或不小于)其左子節點和右子節點的值。
最大堆和最小堆是二叉堆的兩種形式。
最大堆:根結點的鍵值是所有堆結點鍵值中最大者。
最小堆:根結點的鍵值是所有堆結點鍵值中最小者。最小堆示例
建立最小堆
初始數組為:9,3,7,6,5,1,10,2
按照完全二叉樹,將數字依次填入。
填入后,找到最后一個結點,從它的父節點(本示例為數字6的節點)
開始調整。根據性質,小的數字往上移動;至此,第1次調整完成。
注意,被調整的節點,還有子節點的情況,需要遞歸進行調整。
第二次調整,是數字6的節點數組下標小1的節點(比數字6的下標小1的節點是數字7的節點),
用剛才的規則進行調整。以此類推,直到調整到根節點。替換節點
將堆頂刪除,把新增加的23放在堆頂。
顯然加了數后已經不符合最小堆的特性了,我們需要將新增加的數調整到合適的位置。
向下調整,將這個數與它的兩個兒子2和5比較,選擇較小的一個與它交換
此時我們發現還是不滿足最小堆,于是繼續將23與它的兩個兒子中較小的一個交換。
再交換新增節點
如果只是想新增一個數,而不是刪除最小值,只需要將新元素插入到末尾,再根據情況判斷新元素是否需要上移,直到滿足新的特性位置。
加入我們現在要加入一個3
先將3與它的父節點25比較,發現比父節點小,需要與父節點交換。以此類推
轉載于:https://www.cnblogs.com/bincoding/p/8975835.html
總結
- 上一篇: AOP和IOC
- 下一篇: 物联网工程导论 简单整理