相關概念
堆是一種完全二叉樹,即按從上到下,從左到右生成的二叉樹。
堆有兩種型別: 大根堆,小根堆。
大根堆:每個結點的值都大於或等於左右孩子結點。
小根堆:每個結點的值都小於或等於左右孩子結點。
計算某個節點的父節點和兩個子節點
如上圖,選取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的樹 每個節點最多有兩個孩子節點 兩個孩子節點被區分為左孩子節點和右孩子節點 滿二叉樹 完全二叉樹 堆的向下調整 假設 節點的左右子樹都是堆,但自身不是堆 當根節點的左右子樹都是堆時,可以通...