第一種方法HeapInsert
它可以假定我們事先不知道有多少個元素,通過不斷往堆里面插入元素進行調整來構建堆。
它的大致步驟如下:
-
首先增加堆的長度,在最末尾的地方加入最新插入的元素。
-
比較當前元素和它的父結點值,如果比父結點值大,則交換兩個元素,否則返回。
-
重復步驟2.
這種插入建堆的時間復雜度是O(NlogN)
第二種方法Heapify
從最后一個非葉子節點一直到根結點進行堆化的調整。如果當前節點小於某個自己的孩子節點(大根堆中),那么當前節點和這個孩子交換。Heapify是一種類似下沉的操作,HeapInsert是一種類似上浮的操作。
這種建堆的時間復雜度是O(N)
怎么找到第一個非葉子節點
參考博客中根節點在數組中的索引為1,所以第一個非葉子節點的計算公式為: last_non_leaf = arr.length/2。
如果根節點在數組中的索引為0,那么第一個非葉子節點的計算公式為: last_non_leav = (arr.length - 2)/2
可以設最后一個非葉子節點位置為x,那么最后一個葉子節點一定是(2x+1) 或者(2x+2)中的一個,然后可以建立方程求解。