演算法導論讀書筆記(6)堆排序

2021-07-31 23:46:38 字數 3103 閱讀 9283

複雜度o(nlgn)原址排序

集插入排序和歸併排序兩者的優點

計算給定節點下標i的父,左孩子,右孩子的下標

parent(i) return i/2

left(i) return 2i

right(i) return 2i + 1

最大堆(堆中最大元素存放在根結點)

最小堆(堆中最小元素存放在根結點)

從a[i]、a[left(i)]和a[right(i)]中選出最大的,並將下標儲存在largest中。如果a[i]是最大的,程式結束。否則,最大元素是i的某個孩子結點,則交換a[i]和a[largest]的值,從而使i及其孩子都滿足最大堆的性質。在交換後,下標為largest的結點的值是原來的a[i],於是以該結點為根的子樹又可能會違反最大堆的性質,因此,需要對孩子樹遞迴呼叫max-heapify

max-heapify(a, i)

l = left(i)

r = right(i)

if l <= a.heap-size and

a[l] > a[i]

largest = l

else

largest = i

if r <= a.heap-size and

a[r] > a[largest]

largest = r

if largest != i

exchange a[i] with a[largest]

max-heapify(a, largest)

max-heapify的時間複雜度為o(h), h = 樹高。

當用陣列儲存n個元素的堆時,葉結點下標分別是⌊n/2⌋+1, ⌊n/2⌋+2, …, n.

用自底向上的方法利用過程max-heapify把乙個大小為n = a.length的陣列a[1..n]轉換為最大堆。

build-max-heap(a)

a.heap-size = a.

length

fori = ⌊a.

length/2⌋ downto 1

max-heapify(a, i)

每次呼叫max-heapify的時間複雜度是o(lgn)build-max-heap需要o(n)次這樣的呼叫。因此總的時間複雜度是o(nlgn)。這個上界雖然正確,但不是漸近緊確。

先建成最大堆,因陣列中最大的元素在根結點a[1],通過把它與a[n]互換,可以儲存最大的元素並從堆中去掉結點n,剩餘的結點中,原來根的孩子結點仍然是最大堆,而新的根結點可能會違背最大堆的性質,因此需要呼叫max-heapify(a, 1)構造乙個新的最大堆,不斷重複這一過程,直到堆的大小降到2。

heapsort(a)

build-max-heap(a)

for i = a.length downto 2

exchange a[1] with a[i]

a.heap-size = a.heap-size - 1

max-heapify(a, 1)

時間複雜度o(nlgn)優先佇列有兩種形式

1. 最大優先佇列

2. 最小優先佇列,可被用於基於事件驅動的模擬器。佇列中儲存要模擬的事件,每個事件都有乙個發生時間作為其關鍵字。事件必須按照發生的時間順序進行模擬,因為某一事件的模擬結果可能會觸發對其他事件的模擬

修改關鍵字的大小後,當前元素會不斷地與其父結點進行比較,如果當前元素的關鍵字較大,則當前元素與其父結點進行交換。不斷重複該過程,直到當前元素的關鍵字小於其父結點時終止。

heap-increase-key(a, i, key)

if key < a[i]

error "new key is smaller than currenty key"

a[i] = key

while i > 1

anda[parent(i)] < a[i]

exchange a[i] with a[parent(i)]

i = parent(i)

首先增加乙個葉結點來擴充套件最大堆,然後呼叫heap-increase-key為新結點設定對應的關鍵字,同時儲存最大堆的性質

max-heap-insert(a, key)

a.heap-size = a.heap-size + 1

a[a.heap-size] = 0

heap-increase-key(a, a.heap-size, key)

演算法導論 6 堆排序

堆的分類 最大堆性質 高度 對於堆的一些基本操作 偽 描述 實現 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...

演算法導論 python實踐(6 堆排序)

簡單來講就是將陣列按照完全二叉樹的形式排列。葉節點的元素個數最多為2 n 1 次方,其中n為堆高度。最大堆 某一根葉節點的元素小於等於根節點的數值。通常用於排序 最小堆 某一根葉節點的元素大於等於根節點的數值。通常用於構造優先佇列 首先建立最大堆 函式輸入引數為乙個序列和序列的某一下標。對於某一下標...

《演算法導論》學習分享 6 堆排序

堆排序也是一種時間複雜度為o n lg n omicron n lg n o nlgn 的排序演算法,但是與歸併排序不同的是堆排序是一種原址排序,也就是說排序過程只是交換資料的位置。堆是乙個陣列,儲存乙個近似完全二叉樹,樹上的每個結點對應陣列中的乙個元素,陣列第乙個元素儲存根節點,第i個元素的左孩子...