1. 程式人生 > >兩種建立堆的方法HeapInsert & Heapify

兩種建立堆的方法HeapInsert & Heapify

堆排序 子節點 自己的 nlog http 計算公式 步驟 一個 葉子節點

參考 堆排序中兩種建堆方法的比較

第一種方法HeapInsert

它可以假定我們事先不知道有多少個元素,通過不斷往堆裏面插入元素進行調整來構建堆。

它的大致步驟如下:

  1. 首先增加堆的長度,在最末尾的地方加入最新插入的元素。

  2. 比較當前元素和它的父結點值,如果比父結點值大,則交換兩個元素,否則返回。

  3. 重復步驟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)中的一個,然後可以建立方程求解。

兩種建立堆的方法HeapInsert & Heapify