演算法導論 6 堆排序

2021-10-03 18:07:45 字數 1250 閱讀 4307

堆的分類

最大堆性質 高度

對於堆的一些基本操作

偽**描述

**實現: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 ...