演算法最壞情況執行時間
平均情況/期望執行時間
插入排序
$\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 ...