第7章 排序
任何通用的排序演算法均需要nlogn次比較
7.1 預備知識
略7.2 插入排序
插入排序思想:在已排序狀態插入新元素
插入排序的最壞情形和平均情形均為n的平方
7.3 一些簡單排序演算法的下界
通過比較和交換來進行排序的演算法本質上是消除序列中的逆序數,因此求解該演算法的時間複雜度時,需要計算其排序序列的逆序數。
7.4 希爾排序
希爾排序需要乙個最低為1的增量序列。
希爾排序的本質則是通過比較非相鄰元素來消除逆序數的高階插入排序版。
相對於只比較相鄰元素的插入排序,希爾排序比較了非相鄰元素,保證消除了至少為1的逆序數,因此其效能有可能突破插入排序的n平方界。
希爾排序的增量序列最小為1,保證了序列每個都可被比較排序到,保證序列最終有序。
希爾排序過程中,通過不斷縮減增量序列,跳躍比較不同的元素。
乙個k排序過的序列保持其k排序性。
k排序的一般思路:對於k,k+1,。。。n-1的每乙個元素i,將其放到i,i-k,i-2k。。的合適位置上。
其實就是對k個子陣列執行插入排序。
希爾建議的序列為開始序列為n/2的下限,後續序列為前面序列的一半,直至1。
使用希爾增量的最壞情形執行時間為n平方。
7.5 堆排序
堆排序利用了每次刪除操作後空出的位置,將刪除後的元素放到空出的位置節省記憶體。
7.6 歸併排序
歸併排序使用了所有流行排序中最少的比較次數。
歸併排序是分治演算法思想的運用。
其本質是遞迴對兩個已排序子串行進行排序。
7.7 快速排序
快速排序一般採用三數中值分割法。
快速排序的本質是遞迴地將元素放在合適的位置。也正因為這樣,提供了篩選出第k大元素的nlogn演算法。
快速元素一般對於遇到相等元素時採用停止的演算法。
對於小陣列,快速排序不如插入排序,所以當n小於20時,可進行插入排序。
快速排序一定考慮相等序列的情形,因為遞迴會將相等的元素放到一起。
7.8 排序演算法的一般下界
略7.9 選擇問題的決策樹下界
如果決策樹所有的葉子都有深度d或更深,則決策樹必須至少有2d個葉子。
對任何基於比較的演算法,找最小元都必須至少使用n-1次比較。
從n個元素中找最小元的決策是必須至少有2的n-1次方個葉子。
7.10 對手下界
7.11 線性時間的排序:桶排序和基數排序
桶排序使用了額外的陣列,利用空間換時間。通過使用陣列的位置可以快速索引的特性,將需要排序的陣列值與數值位置對映起來。
基數排序用於對數字範圍較大的數字的排序,通過依次對不同的位上的數排序,來達到對數的整體排序。
計數基數排序的方便之處在於解決基數排序時表的建立,通過引入乙個額外陣列用於記錄需排序值的位置,達到將值放到陣列正確位置的做法。
7.12 外部排序
外部排序一般利用了歸併演算法,通過將外存中的記錄讀到記憶體排序並寫回外存,接著依次讀取已經排序好的外存中的記錄進行邊讀取邊歸併操作。
多路合併改善了兩路合併的多次io的效能,可以通過使用優先佇列,對多路的記錄進行歸併排序。
多相合併則是在極大節約磁碟空間的情況下的合併演算法。
替換選擇在與最優化的利用記憶體,盡量通過一次記憶體排序的記錄數的提高減少歸併的次數。
疑難點
演算法導論 第7章 快速排序
一 快速排序演算法的基本特性 時間複雜度 o n lgn 最壞 o n 2 空間複雜度 o n lgn 不穩定。快速排序是一種排序演算法,對包含n個數的輸入陣列,平均時間為o nlgn 最壞情況是o n 2 通常是用於排序的最佳選擇。因為,排序最快,也只能達到o nlgn 二 快速排序演算法的描述 ...
演算法導論 第7章 高速排序
高速排序在最壞情況下的時間複雜度為o n 2 儘管在最壞情況下執行時間比較差,可是高速排序一般是用於排序的最佳選擇。由於其平均效能相當好,期望的執行時間為o nlgn 且在o nlgn 的記號中隱含的常數因子非常小。高速排序和合併排序有相似之處,都是須要劃分序列,在合併排序中。劃分的過程非常easy...
演算法導論 第7章快速排序
1 演算法描述 快速排序也是基於分治模式的,下面是乙個典型子陣列a p.r 排序的分治過程,主要分為三個步驟 1 分解 將陣列a p.r 劃分成兩個子陣列a p.q 1 和a q 1.r 使得前乙個陣列中每個值都小於等於a q 後乙個陣列每個值都大於a q 下標q也在這個分解過程中求得。2 解決 通...