加入由乙個無序陣列:[9, 4, 8, 3, 5, 1, 2, 6, 7, 0]
思路:先將無序陣列構建成乙個完全二叉樹:
----------------------------------------------正 文 分 割 線----------------------------------------------
什麼是二叉樹?
二叉樹模型(圈裡的數字代表著標號,而不是實際存放的資料):
什麼是二叉樹:
二叉數是只擁有兩顆子樹的樹,兩顆子樹分別被稱為「左子樹「和」右子樹」.
什麼是堆?
堆是乙個特殊的完全二叉樹,並且;設有乙個堆頂編號為1的含有n個元素的堆,總是有以下的幾點特性:
從乙個無序完全二叉樹到乙個大/小頂堆主要靠的就是調整這個堆。
流程解析:
從最後乙個非葉子節點(數值為5的節點)開始,若父節點小於子節點,則互換他們兩的位置,如下:
然後依次從右至左,從下到上進行,下乙個便是數值為8的節點(這個節點沒有什麼變化),接下來是數值為 4 的節點:
但是這樣子會導致 新的數值為 4 的節點亂掉,所以需要再對 這個 數值為4的節點進行調整。如圖:
這樣就可以經行下一步的調整了,然後我們繼續對剩下的節點做相同的事情就ok啦。
import math
def adjust_heap(arr, i): # arr為佇列,i為非葉子節點的編號
length = len(arr)
k = 2 * i + 1 # k為左孩子的下標
if i >= length/2: # 擁有子節點的才能繼續往下走
return
if k + 1 < length: # 確定該右子節點是否存在
if arr[k] < arr[k + 1]: # 存在則比較左右子節點
k += 1 # 如果右子節點大於左子節點,則指向右子節點
print(i, k, arr[i], arr[k], sep = '*')
if arr[i] < arr[k]:
print(i,k, arr[i], arr[k],sep = '#')
arr[i], arr[k] = arr[k], arr[i] # 交換父子節點
print(i,k, arr[i], arr[k], sep = '#')
adjust_heap(arr, k) # 對交換的子節點進行修復
def build_big_heap(arr):
length = len(arr)
i = int(length/2) - 1
while i >= 0:
adjust_heap(arr, i)
i -= 1
if __name__ == "__main__":
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4]
build_big_heap(a)
print(a)
小頂堆及大頂堆的建立
首先明確堆是乙個完全二叉樹,小頂堆指根結點的值小於或等於左右子節點的值,大頂堆指根結點的值都大於或等於左右子節點的值 關於大小頂堆的建立更詳細的介紹 include include include include include include include include using names...
大頂堆小頂堆
堆通常是乙個可以被看做一棵完全二叉樹的陣列物件 如果對一棵有n個結點的完全二叉樹的結點按層序編號 從第1層到第 1層,每層從左到右 則對任一結點i 1 i n 有 1 如果i 1,則結點i無雙親,是二叉樹的根 如果i 1,則其雙親是結點。2 如果2i n,則結點i為葉子結點,無左孩子 否則,其左孩子...
堆排(大頂堆,小頂堆)
分類 資料結構 演算法相關 2009 10 15 12 26 2289人閱讀收藏 舉報汗,別人都說大小頂堆只是改改大於號的問題,可我的 從大頂堆只改動大於號調整為小頂堆竟然越界樂,掣肘!後來幾經更改才發現是傳參的問題 見 看來大頂堆改小頂堆不是 亦或是我rp出點問題?搞笑的是 磚頭 c b 竟然對越...