建立最大(小)堆
二叉堆本質上是一種完全二叉樹,儲存方式並不是鏈式儲存,而是順序儲存
堆操作:插入(葉子節點上調),刪除(堆頂元素下沉)
堆建立:非葉子節點下沉(從最後乙個非葉子節點開始)
最小堆:
最小堆任何乙個父節點的值,都小於等於它左右孩子節點的值
建立過程:如果非葉子節點值大於其子節點,將其下沉
最大堆:
最大堆任何乙個父節點的值,都大於等於它左右孩子節點的值。
建立過程:如果非葉子節點值小於其子節點,將其下沉
#最小堆
def upadjust(nums):
childindex = len(nums)-1
parentindex = (childindex-1)//2
temp = nums[childindex] #插入的葉子節點值
while childindex>0 and temp
nums[childindex] = nums[parentindex]
childindex = parentindex
parentindex = (parentindex-1)//2
nums[childindex] = temp
def downadjust(nums,parentindex):
temp = nums[parentindex]
childindex = 2*parentindex + 1
while childindex < len(nums):
#右孩子值小於左孩子,父節點和小的交換
if childindex +1
childindex += 1
if temp < nums[childindex]: #父節點小於子節點,不用調整
break
nums[parentindex] = nums[childindex]
parentindex = childindex
childindex = childindex*2+1
nums[parentindex] = temp
def buildminheap(nums):
for i in range((len(nums)-1)//2,-1,-1):
downadjust(nums,i)
>>> nums = [5,8,6,3,9,2,1,7,0]
>>> buildminheap(nums)
>>> nums
[0, 3, 1, 5, 9, 2, 6, 7, 8]
#最大堆
#非葉子節點小值下沉
def downadjust(nums,parentindex):
temp = nums[parentindex]
childindex = 2*parentindex + 1
while childindex < len(nums):
if childindex +1 nums[childindex]:#右孩子值大於左孩子,父節點和大的交換
childindex += 1
if temp > nums[childindex]: #父節點大於子節點,不用調整
break
nums[parentindex] = nums[childindex]
parentindex = childindex
childindex = childindex*2+1
nums[parentindex] = temp
def buildmaxheap(nums):
for i in range((len(nums)-1)//2,-1,-1):
downadjust(nums,i)
>>> nums = [5,8,6,3,9,2,1,7,0]
>>> buildmaxheap(nums)
>>> nums
[9, 8, 6, 7, 5, 2, 1, 3, 0]
python自帶堆模組
>>> import heapq
#預設最小堆
>>> nums = [5,8,6,3,9,2,1,7,0]
>>> heapq.heapify(nums)
>>> nums
[0, 3, 1, 5, 9, 2, 6, 7, 8]
演算法 之 堆 建立堆
給出乙個有n個元素的陣列a 1.n 要建立乙個包含這些元素的堆,可以這樣進行 從空的堆開始,不斷插入每乙個元素,直到a完全被轉移到堆中為止。因為插入第j個鍵值用時o log j 因此用這種方法建立堆疊的時間複雜性是o n log n 我們知道對應於堆h 1.n 的樹的節點可以方便地以自頂向下 從左到...
python堆 Python實現堆
堆 heap 是一種經過排序的完全二叉樹,其中任一非葉子節點的值均不大於 或不小於 其左孩子和右孩子節點的值。堆,又被為優先佇列 priority queue 儘管名為優先佇列,但堆並不是佇列。其他概念解釋 最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。...
堆 大根堆和小根堆的建立
堆是一種經過排序的完全二叉樹,其中任一非終端節點的資料值均不大於 或不小於 其左孩子和右孩子節點的值。1 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最小者的堆稱為小根堆。1 根結點 亦稱為堆頂 的關鍵字是堆裡所有結點關鍵字中最大者,稱為大根堆。用堆的關鍵部分是兩個操作 1 put操作 即往堆...