python堆排序的庫 Python 堆排序

2021-10-20 01:40:25 字數 1501 閱讀 9503

相關概念

堆是一種完全二叉樹,即按從上到下,從左到右生成的二叉樹。

堆有兩種型別: 大根堆,小根堆。

大根堆:每個結點的值都大於或等於左右孩子結點。

小根堆:每個結點的值都小於或等於左右孩子結點。

計算某個節點的父節點和兩個子節點

如上圖,選取3這個節點,他的序號:i = 3

父節點:parent = ( i - 1 ) / 2 = 1 (這裡進行的是取整)

左子節點:c1 = 2i + 1 = 7

右子節點:c2 = 2i + 2 = 8

堆排序的步驟

第一步:能夠將某一節點及其子節點堆化(heapify);

第二步:從最後乙個父節點開始,向前對他們進行第一步操作,最終得到乙個大根堆;

第三步:將根節點值(最大值)和最後乙個節點值進行交換;

第四步:將除最後乙個節點外的元素,進行堆化操作。

複製**

堆化某一節點和其子節點

def heapify(tree, node, i):

對 i 節點進行堆化,i 是 parent 節點

需要找到 i 的兩個子節點

c1 = 2 * i + 1

c2 = 2 * i + 2

需要找出 i,c1,c2 這三個節點中的最大值

先假設 i 為最大值

max_node = i

判斷 c1和c2 是否存在,找到最大值的下標,即max_node

if c1 < node and tree[c1] > tree[max_node]:

max_node = c1

if c2 < node and tree[c2] > tree[max_node]:

max_node = c2

max_node 不等於 i,則說明存在子節點大於 i這個父節點

將這個子節點的值和父節點的值進行交換,最大值成為根節點

if max_node != i:

tree[i], tree[max_node] = tree[max_node], tree[i]

heapify(tree, node, max_node)

堆排序def heapsort(arr):

n = len(arr)

last_parent = (n - 2) // 2

從最後乙個父節點開始向前進行 heapify 操作

將 arr 堆化,最大值成為根節點

for i in range(last_parent, -1, -1):

heapify(arr, n, i)

for i in range(n - 1, 0, -1):

# 將根節點和最後乙個節點進行值交換

arr[i], arr[0] = arr[0], arr[i]

# 剩下的 i 個節點進行 heapify

heapify(arr, i, 0)

lis = [2, 3, 5, 1, 6]

heapsort(lis)

print(lis)

python堆排序演算法 Python 堆排序

python 堆排序 堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。largest i l 2 i 1 left 2 i...

堆排序python理解 堆排序Python實現

def heap sort nos global size size len nos print the size of the list is d size build heap size,nos for i in range size 1,0,1 nums 0 nums i nums i num...

python排序 堆排序

樹是一種資料結構 比如 目錄結構 樹是一種可以遞迴定義的資料結構 樹是由n個節點組成的集合 二叉樹 度不超過2的樹 每個節點最多有兩個孩子節點 兩個孩子節點被區分為左孩子節點和右孩子節點 滿二叉樹 完全二叉樹 堆的向下調整 假設 節點的左右子樹都是堆,但自身不是堆 當根節點的左右子樹都是堆時,可以通...