演算法導論(6)

2021-07-22 21:28:49 字數 2581 閱讀 4750

演算法最壞情況執行時間

平均情況/期望執行時間

插入排序

$\theta(n^2)$

$\theta(n^2)$

歸併排序

$\theta(n\lg n)$

$\theta(n\lg n)$

堆排序$o(n\lg n)$

—快速排序

$\theta(n^2)$

$\theta(n\lg n)$(期望)

計數排序

$\theta(k+n)$

$\theta(k+n)$

基數排序

$\theta(d(n+k))$

$\theta(d(n+k))$

桶排序$\theta(n^2)$

$\theta(n)$(平均情況)

演算法時間複雜度

空間原址性

插入排序

$o(n^2)$

是歸併排序

$o(n\lg n)$

否堆排序

$o(n\lg n)$

是max-heapify(a, i) 通過逐級下降,使得下標為 i 的根節點的子樹符合最大堆的性質

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)

每個孩子的子樹的大小最多為 $2n/3$(最壞情況發生在樹的最底層半滿的時候),故max-heapify執行時間 $t(n) \leq t(2n/3) + \theta(1)$,解為$t(n) = o(\lg n)$。

build-max-heap 把大小為 n = a.length 的陣列 a[1..n] 轉換為最大堆。

build-max-heap(a)

a.heap-size = a.length

// 子陣列 $a(n/

2+1..n)$ 中的元素都是葉節點

for i = a.length/2 downto 1

max-heapify(a, i)

heapsort(a)

build-max-heap(a)

for i = a.length downto 2

exchange a[1] wiith a[i]

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

max-heapify(a, 1)

max-heapify 時間複雜度為 $o(\lg n)$,被heapsort n-1 次呼叫,故 heapsort 的時間複雜度為 $o(n\lg n)$

最大優先佇列用於共享計算機系統的作業排程,最小優先佇列用於基於事件驅動的模擬器(關鍵字為事件發生時間)。

heap-maxinum(a)

return a[1]

heap-extract-max(a)

if a.heap-size <

1error "heap

underflow"

max = a[1]

a[1] = a[a

.heap-size]

a.heap-size = a

.heap-size-1

max-heapify(a, 1)

return

max

heap-extract-max 的時間複雜度為 $o(\lg n)$(取決於max-heapify的時間複雜度)。

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

if key <

a[i]

error "new

keyis

smaller

than

current

key"

a[i] = key

while

i > 1 and a[parent(i)] <

a[i]

exchange

a[i] with

a[parent(i)]

i = parent(i)

heap-increase-key 中當前元素不斷與父元素比較,當前元素大則將二者交換,直至當前元素的關鍵字小於父節點。時間複雜度為$o(\lg n)$。

max-heap-insert

(a, key)

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

a[a.heap-size] = - max_int

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

max-heap-insert的時間複雜度為$o(\lg n)$。

演算法導論 第6章

這一章,前言講了為什麼要排序?接著介紹本章主題,堆排序。那麼什麼又是堆呢?一種資料結構,當然有很多性質,這個我在前面資料結構說過了,然後有兩種。1.大根堆 它是用來堆排序的。2.小根堆 它是用來做優先順序佇列的。清楚了這兩種用途,那麼我們來看 關於堆排序 public class heap sort...

演算法導論 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...

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

include include using namespace std 定義結構體,其中包含陣列長alength,堆長heap size。struct dui 返回堆中元素i的父結點的下標 i 2向下取整,即i進行左移一位操作。int parent int i 返回堆中元素i的左孩子的下標 i 2 ...