堆python 建立堆 python

2021-10-11 22:07:32 字數 2134 閱讀 4440

建立最大(小)堆

二叉堆本質上是一種完全二叉樹,儲存方式並不是鏈式儲存,而是順序儲存

堆操作:插入(葉子節點上調),刪除(堆頂元素下沉)

堆建立:非葉子節點下沉(從最後乙個非葉子節點開始)

最小堆:

最小堆任何乙個父節點的值,都小於等於它左右孩子節點的值

建立過程:如果非葉子節點值大於其子節點,將其下沉

最大堆:

最大堆任何乙個父節點的值,都大於等於它左右孩子節點的值。

建立過程:如果非葉子節點值小於其子節點,將其下沉

#最小堆

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操作 即往堆...