演算法導論學習筆記 第六章 堆排序

2021-05-22 14:55:50 字數 2647 閱讀 2815

第六章

堆排序總結:這章主要講了堆、建堆、堆排序、優先順序佇列等。

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 然後這些屬性就可以...

《演算法導論》第六章 堆排序 筆記

堆排序不同於歸併排序的是,堆排序具有和插入排序一樣的空間原址性,任何時候都只需要常數個額外的元素空間儲存臨時資料。因此,堆排序是集合了插入排序和歸併排序兩種演算法優點的排序方法。二叉 堆是乙個陣列,它可以被看成乙個近似的完全二叉樹。樹上的每乙個結點對應陣列中的乙個元素,除了最底層,該樹是完全充滿的,...

演算法導論 第六章《堆排序》

本章開始介紹了堆的基本概念,然後引入最大堆和最小堆的概念。全章採用最大堆來介紹堆的操作,兩個重要的操作是調整最大堆和建立最大堆,接著著兩個操作引進了堆排序,最後介紹了採用堆實現優先順序佇列。二叉 堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹。除了最底層外,該樹是完全充滿的,而且是從左到右填充...