堆的分類
最大堆性質 高度
對於堆的一些基本操作
偽**描述
**實現:max_heapify
(python實現)
123
4567
891011
1213
def max_heapify(i):
# print("max_heapify: ", i)
l = left(i)
r = right(i)
if l <= heap_size and arr[l] > arr[i]:
largest = l
else:
largest = i
if r <= heap_size and arr[r] > arr[largest]:
largest = r
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
max_heapify(largest)
描述
文字描述
在程式的每一步中,從a[i]
、a[left(i)]
、a[right(i)]
中選出最大的,儲存在largest中
如果a[i]是最大的,那麼以i為根節點的子樹已經是最大堆了,程式結束
否則,最大元素是i的某個孩子節點,則交換a[i]
和a[largest]
的值
在交換後,需要對該子樹遞迴呼叫max-heapify
執行時間分析
**實現:build_max_heap
(python實現)
123
4
def build_max_heap():
for i in range(int(len_arr() / 2), 0, -1):
print(i)
max_heapify(i)
時間複雜度 : o(n),證明見書p88
例子如圖
例子如圖
6.5.1 優先佇列的性質
最大優先佇列支援的操作
6.5.2 通過堆來實現優先佇列
演算法導論 python實踐(6 堆排序)
簡單來講就是將陣列按照完全二叉樹的形式排列。葉節點的元素個數最多為2 n 1 次方,其中n為堆高度。最大堆 某一根葉節點的元素小於等於根節點的數值。通常用於排序 最小堆 某一根葉節點的元素大於等於根節點的數值。通常用於構造優先佇列 首先建立最大堆 函式輸入引數為乙個序列和序列的某一下標。對於某一下標...
《演算法導論》學習分享 6 堆排序
堆排序也是一種時間複雜度為o n lg n omicron n lg n o nlgn 的排序演算法,但是與歸併排序不同的是堆排序是一種原址排序,也就是說排序過程只是交換資料的位置。堆是乙個陣列,儲存乙個近似完全二叉樹,樹上的每個結點對應陣列中的乙個元素,陣列第乙個元素儲存根節點,第i個元素的左孩子...
演算法導論讀書筆記(6)堆排序
複雜度o nlgn 原址排序 集插入排序和歸併排序兩者的優點 計算給定節點下標i的父,左孩子,右孩子的下標 parent i return i 2 left i return 2i right i return 2i 1 最大堆 堆中最大元素存放在根結點 最小堆 堆中最小元素存放在根結點 從a i ...