上次用Java實作了最大堆的封裝,這次就來寫一下最小堆的實作吧
插入函數的思路:
向堆中插入元素有兩種情況,一種是堆為空,那麼就讓插入值作為根節點即可;另一種是堆不為空,那麼此時就要進行判斷目前節點與其父節點的大小關系比較。此時仍有兩種情況,一種是目前節點大于父節點,這樣正是我們所希望的;另一種是目前節點的值小于父節點,那麼就要将二者的值進行調換,然後記得更新目前節點為原來父節點的位置,而父節點的位置同樣需要更新(循環正常終止的時候說明已經到了根節點,此時最小值必定為根節點)
siftDown調整過程思路:
給定要進行調整的節點的下标,我們隻需要讓它和它的兩個子節點中最小的那個比較即可(前提是目前節點不是葉子節點),需要注意的是要先儲存目前節點的值,比較之後按大小調整順序即可。
删除對頂元素
需要注意的是currentPos的大小要實時的進行更新,然後傳回所删除的堆頂元素即可
下面是完整的C++關于最小堆的實作的代碼
程式運作結果如下

總結:
代碼中存在一定得錯誤,出在 Insert函數中。個人認為需要對targetPos為0的特殊情況再加一層判斷,估計就能解決。但是對正常添加元素還是能得到比較正常的結果的。