max-heapify(a, i)
1 l← left(i)
2 r← right(i)
3 ifl≤heap-size[a] and a[l] >
a[i]
4then
largest←l
5else
largest←i
6 ifr≤heap-size[a] and a[r] >
a[largest]
7then
largest←r
8 iflargest≠i
9then exchange a[i] ↔a[largest]
10max-heapify(a, largest)
build-max-heap(a)
1heap-size[a] ←
length[a]
2fori
←length[a]/2 downto 1
3do max-heapify(a, i)
heapsort(a)
1 build-max-heap(a)
2 fori←length[a] downto 2
3do exchange a[1] ↔a[i]
4heap-size[a] ←
heap-size[a] - 1
5max-heapify(a, 1)
max-heapify(a,i)
函式通過遞迴,從元素
a[i]
開始與a[i]
的兩個子節點比較,將二者中的較大者與
a[i]
數值對換,如果
a[i]
比兩個子節點數值皆大,則不執行任何操作,並向下一級繼續執行
max-heapify
,即遞迴呼叫。當最後一級執行完畢時,
max-heapify
也就結束了。
max-heapify
的作用就是在執行
build-max-heap(a)
後,將以
a[i]
為子樹的堆中的最大值移動到
a[i]
的位置,即這個子樹的根節點。
build-max-heap(a)
一定要在
max-heapify
之前執行,
build-max-heap(a)
的作用就是從堆的倒數第二層的最後乙個元素開始到堆的頂端位置,迴圈地呼叫
max-heapify
,以實現將堆中最大的元素移動到堆的頂端。
max-heapify
和max-heapify
是區域性與整體的關係,又是被呼叫與呼叫的關係,
max-heapify
完成的是區域性的對較大元素向堆頂方向的移動,而
max-heapify
同過不斷呼叫
max-heapify
,實現了整個堆的將較大元素向堆頂方向的移動。每執行一次
max-heapify
,堆中最大元素一定移動到堆頂。
heapsort(a)
1 build-max-heap(a)//實現 級數大的元素比級數小的元素數值小 這樣的趨勢,
//只是趨勢未必是一定的
2 fori←length[a] downto 2
3do exchange a[1] ↔a[i]//
將堆頂最大元素與堆中最後一級最後乙個
//元素的位置交換。
4heap-size[a] ←
heap-size[a] - 1
5max-heapify(a, 1)//由於exchange,此時堆頂元素是原堆的最後一級上的較小元
//素,而我們要的是乙個整個堆的最大元素,所以要重新建堆。
//由於之前已經執行過build-max-heap,也就是說已經實現
//「級數大的元素一定比級數小的元素數值小」,所以不需
//要在執行一次build-max-heap,只需執行max-heapify即可。
演算法導論 第六章《堆排序》
本章開始介紹了堆的基本概念,然後引入最大堆和最小堆的概念。全章採用最大堆來介紹堆的操作,兩個重要的操作是調整最大堆和建立最大堆,接著著兩個操作引進了堆排序,最後介紹了採用堆實現優先順序佇列。二叉 堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹。除了最底層外,該樹是完全充滿的,而且是從左到右填充...
演算法導論 第六章 堆排序
二叉 堆資料結構是一種陣列物件,如下圖所知,他可以被視為一顆完全二叉樹。其有如下性質 1 對於i節點 i表示下標 其父節點為li 2 左孩子節點為2i,右孩子節點為2i 1 2 最大堆滿足 a parent i a i 最小堆滿足 a parent i a i 3 堆的高度為 lgn 4 子陣列元素...
演算法導論第六章 堆排序
堆排序 主要是二叉堆,是乙個陣列,可以近似看作是一棵完全二叉樹。最壞情況執行時間為 n log n 主要性質 1.對於任意乙個下標index,書上寫的是左子女的下標為 2 index,右子女為 2 index 1 但是在實際程式設計中,下標是從0開始的,所以下標的變化應該為 左子女為2 index ...