第七章 計算複雜度概論:排序問題 7.1計算複雜度 7.2插入排序與選擇排序 7.3每次比較至多移除一個導致之演算法的下限 第七章 計算複雜度概論:排序問題 7.1計算複雜度 7.2插入排序與選擇排序 7.3每次比較至多移除一個導致之演算法的下限 7.4再探合併排序 7.5再探快速排序 7.6堆積排序 7.6.1堆積與基本的堆積副程式 7.6.2實作堆積排序
7.7合併排序、快速排序、堆積排序 的比較 7.8僅利用Key的比較進行排序的下限 7.8.1提供排序演算法使用的 決策樹(decision tree) 7.8.2最差情況下的下限 7.8.3平均情況下的下限 7.9分堆排序(基數排序法, Radix Sort)
7.1計算複雜度 計算複雜度:研究解決一個給定問題之所有可能演算法的領域,而這個領域與演算法的設計及分析關聯性很高。 排序工作:重排紀錄,使得紀錄會根據Key值的大小依序排好。
原地置換排序(in-place sort)
7.2 插入排序與選擇排序
演算法7.1插入排序(Insertion Sort)
分析演算法7.1 最差情況下,以key比較次數為準的時間複雜度分析(插入排序) 基本運算:比較S[ j ]與x 輸入大小:n,被拿來排序的key之個數
分析演算法7.1 平均情況下,以key比較次數為準的時間複雜度分析(插入排序)
分析演算法7.1 額外空間的使用情況(插入排序) 分析演算法7.1 額外空間的使用情況(插入排序) 唯一會隨著n的增加而增加的使用空間的是輸入陣列S的大小。因此,該演算法屬於原地置換排序,而額外使用空間的複雜度在 中
表7.1 交換排序、插入排序、 與選擇排序的分析摘要 表7.1 交換排序、插入排序、 與選擇排序的分析摘要
演算法7.2 選擇排序(Selection Sort)
7.3 每次比較至多移除 一個倒置之演算法的下限
定理7.1
7.4再探合併排序
圖7.2 對一個順序顛倒的執入進行合併排序
分析演算法7.2 額外空間的使用情況(合併排序2) 分析演算法7.2 額外空間的使用情況(合併排序2)
演算法7.3 合併排序3(動態規劃版)
演算法7.4 合併排序4(鏈結版)
分析演算法7.4 額外空間的使用情況分析(合併排序4) 分析演算法7.4 額外空間的使用情況分析(合併排序4) 在一般的情況下,使用的額外空間在 個鏈結中。“在 個鏈結中”代表 鏈結的個數在 中
7.5再探快速排序
額外空間的使用情況分析 (改良式快速排序) 額外空間的使用情況分析 (改良式快速排序) 在這個版本中,最差情況發生在當partition每次都把陣列切成一半的時候,造成堆疊的深度約為lgn。因此最差的空間使用情況為
7.6 堆積排序 7.6.1 堆積與基本的堆積副程式
完整二元樹(complete binary tree) 所有內部節點都有兩個子節點 所有leaf節點的深度均為d
本質完整二元樹 (essentially complete binary tree) 如果從根節點看到d-1層是一顆完整二元樹 在第d層的節點盡量靠左邊
堆積(heap) 屬於本質完整二元樹 儲存於節點中的值均來自於一個有序集合 節點的值大於或等於其子節點的值。這點稱作堆積特性(heap property)
圖7.6
圖7.6的高階虛擬碼
移除位於根節點的key並回覆堆積特性函式之高階虛擬碼
給定一個具有n個key的堆積,負責將排序好的序列放進陣列s函式的高階虛擬式
圖7.7
圖7.7的高階虛擬碼
堆積排序(Heapsort)的高階虛擬碼
7.6.2實作堆積排序
堆積(heap)的資料結構 在一般的情況下,使用的額外空間在 個鏈結中。“在 個鏈結中”代表鏈結的個數在 中
演算法7.5 堆積排序
分析演算法7.5 以key的比較次數 來看,最差情況的時間複雜度分析 基本運算:在副程式siftdown中,key的比較次數 輸入大小:n,將被排序key的數目
分析Makeheap
分析removekeys
圖7.10
前兩個分析的總結
堆積排序的平均情況時間複雜度
分析演算法7.5 額外空間的使用情況分析(堆積排序) 分析演算法7.5 額外空間的使用情況分析(堆積排序) 堆積排序是一種原地置換排序,意味著他使用的額外空間在 中
7.7 合併排序、快速排序、 堆積排序的比較
表7.2
7.8 僅利用key的比較 進行排序的下限
7.8.1 提供排序演算法使用的 決策樹(decision tree)
圖7.11
圖7.12
7.8.2 最差情況下的下限
定理7.2 任一僅靠key的比較來排序n個相異key的必然式(deterministic)演算法在最差情況下必須作至少 [log(n!)]次key的比較 證明:由輔助定理7.1,任一種僅靠key的比較來排序n個相異key的必然式(deterministic)演算法都對應到一顆有效且被修剪過,並含有n!個leaf節點的二元決策樹。由輔助定理7.3,該樹的深度大於或等於[log(n!)]。由輔助定理7.2我們得知任意決策樹最差情況的比較次數為該樹的深度,因此本定理得證
定理7.3 任一僅靠key的比較來排序n個相異key的必然式(deterministic)演算法在最差情況下必須做至少 [nlgn-1.45n]次key的比較 證明:這個證明可由定理7.2及輔助定理7.4推導而來
7.8.3 平均情況下的下限
圖7.13
定理7.4
7.9分堆排序(基數排序法,sort)
演算法7.6基數排序
分析演算法7.6 所有情況的時間複雜度(基數排序法) 分析演算法7.6 所有情況的時間複雜度(基數排序法)
分析演算法7.6 額外空間的使用情況(基數排序法) 分析演算法7.6 額外空間的使用情況(基數排序法)