資料結構與演算法 堆排序 python實現

2021-10-07 10:15:59 字數 1294 閱讀 4847

def heap_sort(arr):

max_index = len(arr) - 1

# 構建大頂堆,0位置上為最大值

heap_swift(arr, 0, max_index)

# end_index 為每次得到最大值後,最大值應該放的位置

for end_index in range(1, max_index + 1).__reversed__():

# 將得到的當前0位置上最大值,交換到它應該放的位置

swap_elem(arr, 0, end_index)

# 在剩下的元素裡面比較得出最大值

swift_node(arr, 0, end_index - 1)

def heap_swift(arr, start_index, end_index):

last_non_leaf_index = (len(arr) - 1) // 2

for i in range(start_index, last_non_leaf_index + 1).__reversed__():

# 自底向上遍歷非葉子節點,調整各自和孩子的位置

swift_node(arr, i, end_index)

def swift_node(arr, node_index, end_index):

left_child_index = 2 * node_index + 1

while left_child_index <= end_index:

right_child_index = left_child_index + 1

max_child_index = left_child_index # 最大孩子節點索引

if right_child_index <= end_index and arr[left_child_index] < arr[right_child_index]:

max_child_index = right_child_index

if arr[max_child_index] > arr[node_index]: # 最大child節點值比自己大,需要調整

swap_elem(arr, max_child_index, node_index)

node_index = max_child_index

left_child_index = 2 * node_index + 1

else:

# 節點無需和自己child節點比較了,可以終止迴圈

break

資料結構與演算法 堆排序

1 堆的性質 堆是一棵完全二叉樹,除最後一層外每層都是滿的 元素個數為2 i 1 根節點為第1層 最後一層如果不滿則只缺少右邊葉結點。如果按照廣度優先,即從上至下,從左至右對節點編號。根節點序號為0,節點i的父節點是 i 1 2,左子節點是2 i 1。最小堆中任意父節點不能比子節點大,最大堆中任意父...

資料結構與演算法 堆排序

基礎概念 堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,它的最壞,最好,平均時間複雜度均為o nlogn 它也是不穩定排序。通俗理解 將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n 1個元素重新...

資料結構與演算法 堆排序

堆排序堆排序是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹的結構,並同時滿足堆的性質 即子節點的鍵值或索引總是小於 或者大於 它的父節點,堆排序的時間複雜度為o nlogn 來自維基百科 什麼是堆 堆是一種特殊的完全二叉樹,它的性質為 任意節點大於等於或者小於等於它的左右節點。...