第六章
堆排序總結:這章主要講了堆、建堆、堆排序、優先順序佇列等。
1.
堆
堆可以被視為一顆完全二叉樹,底層用陣列實現。
length[a]:
陣列中的元素個數
heap-size[a]:
存放在a
中的堆的元素個數
樹的根a[1]
給定某個結點的下標i:
父節點parent(i)=[i/2]
左節點left(i)=2i
右節點right(i)=2i+1
最大堆:
a[parent(i)] >= a[i]
最小堆:a[parent(i)] <= a[i]
2.
保持堆的性質
max-heapify(a, i)
輸入陣列
a,下標
i,假設以
left(i)
和right(i)
為根的兩顆二叉樹都是最大堆,要使以
a[i]
為根的二叉樹也是最大堆。
分析:複雜度
o(lgn)
偽**max-heapify(a, i)
l <- left(i)
r <- right(i)
largest <- i
if l<=heap-size[a] and a[l]>a[largest]
then largest <- l
if r<=heap-zise[a] and a[r]>a[largest]
then largest <- r
if largest != i
then exchange a[i] <-> a[largest]
max-heapify(a, largest)
3.
建堆
build-max-heap(a)
將陣列a
變為最大化堆
自底向上建堆,子陣列
a[(n/2)+1, …, n]
中的元素都是樹中的葉子
分析:複雜度
o(n)
偽**build-max-heap(a)
heap-size[a] <- length[a]
for i <- (length[a]/2) downto 1
max-heapify(a, i)
4.
堆排序演算法heapsort(a)
將a
進行排序,從小到大輸出
分析:o(nlgn)
偽**heapsort(a)
build-max-heap(a)
for i <- length[a] downto 2
do exchange a[1] <-> a[i]
heap-size[a] <- heap-size[a]-1
max-heapify(a, 1)
5.
優先佇列
可以用堆實現
1)heap-maximum(a)返回a
中的最大值
分析:o(1)
偽**heap-maximum(a)
return a[1]
2)heap-extract-max(a)去掉a
中的最大值
分析:o(lgn)
偽**heap-extract-max(a)
if heap-size[a] < 1
then error 「heap underflow」
max <- a[1]
a[1] <- a[heap-size[a]]
heap-size[a] <- heap-size[a]-1
max-heapify(a, 1)
return max
3)heap-increase-key(a, i, key)
將a[i]
的值增加為
key,人要保持最大堆的特性
分析:o(lgn)
偽**heap-increase-key(a, i, key)
if key < a[i]
then error 「new key is smaller than the current key」
a[i] <- key
while i>1 and key > a[parent(i)]
do exchange a[i] <-> a[parent(i)]
i <- parent(i)
4)max-heap-insert(a, key)
將key
插入到a
分析:o(lgn)
偽**max-heap-insert(a, key)
heap-size[a] <- heap-size[a]+1
a[heap-size[a]] <-
負無窮大
heap-increase-key(a,heap-size[a],key)
最大堆的c++實現
演算法導論 學習筆記 第六章 堆排序
這一章主要講了兩個點 1.堆排序。2.堆排序的應用 優先順序佇列 堆堆是一種完全二叉樹 不理解 反正是一種樹狀的資料結構了吧。有幾種操作。求左子節點 2i 求右子節點 2i 1 求父節點 i 2 下取整。保持最大堆結構 max heapfiy 建堆 building a heap 然後這些屬性就可以...
《演算法導論》第六章 堆排序 筆記
堆排序不同於歸併排序的是,堆排序具有和插入排序一樣的空間原址性,任何時候都只需要常數個額外的元素空間儲存臨時資料。因此,堆排序是集合了插入排序和歸併排序兩種演算法優點的排序方法。二叉 堆是乙個陣列,它可以被看成乙個近似的完全二叉樹。樹上的每乙個結點對應陣列中的乙個元素,除了最底層,該樹是完全充滿的,...
演算法導論 第六章《堆排序》
本章開始介紹了堆的基本概念,然後引入最大堆和最小堆的概念。全章採用最大堆來介紹堆的操作,兩個重要的操作是調整最大堆和建立最大堆,接著著兩個操作引進了堆排序,最後介紹了採用堆實現優先順序佇列。二叉 堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹。除了最底層外,該樹是完全充滿的,而且是從左到右填充...