1. 程式人生 > >快速排序和二分查詢時間複雜度詳解

快速排序和二分查詢時間複雜度詳解

快速排序的時間主要耗費在劃分操作上,對長度為 k 的區間進行劃分,共需 k-1 次關鍵字的比較。

最壞時間複雜度:最壞情況是每次劃分選取的基準都是當前無序區中關鍵字最小(或最大)的記錄,劃分的結果是基準左邊的子區間為空(或右邊的子區間為空),而劃分所得的另一個非空的子區間中記錄數目,僅僅比劃分前的無序區中記錄個數減少一個。因此,快速排序必須做 n-1 次劃分,第 i 次劃分開始時區間長度為 n-i-1, 所需的比較次數為 n-i(1<=i<=n-1), 故總的比較次數達到最大值 Cmax =n(n-1)/2=O(n^2) 。如果按上面給出的劃分演算法,每次取當前無序區的第 1 個記錄為基準,那麼當檔案的記錄已按遞增序(或遞減序)排列時,每次劃分所取的基準就是當前無序區中關鍵字最小(或最大)的記錄,則快速排序所需的比較次數反而最多。

最好時間複雜度:在最好情況下,每次劃分所取的基準都是當前無序區的“中值”記錄,劃分的結果與基準的左、右兩個無序子區間的長度大致相等。總的關鍵字比較次數為 O(n×lgn)。

用遞迴樹來分析最好情況下的比較次數更簡單。因為每次劃分後左、右子區間長度大致相等,故遞迴樹的高度為 O(lgn),而遞迴樹每一層上各結點所對應的劃分過程中所需要的關鍵字比較次數總和不超過 n,故整個排序過程所需要的關鍵字比較總次數 C(n)=O(n×lgn) 。因為快速排序的記錄移動次數不大於比較的次數,所以快速排序的最壞時間複雜度應為 O(n^2 ),最好時間複雜度為 O(n×lgn)。

基準關鍵字的選取:在當前無序區中選取劃分的基準關鍵字是決定演算法效能的關鍵。 ① “三者取中”的規則,即在當前區間裡,將該區間首、尾和中間位置上的關鍵字比較,以三者之中值所對應的記錄作為基準,在劃分開始前將該基準記錄和該區的第 1 個記錄進行交換,此後的劃分過程與上面所給的 Partition 演算法完全相同。 ② 取位於 low 和 high 之間的隨機數 k(low<=k<=high), 用 R[k] 作為基準;選取基準最好的方法是用一個隨機函式產生一個位於 low 和 high 之間的隨機數 k(low<=k<=high), 用 R[k] 作為基準 , 這相當於強迫 R[low..high] 中的記錄是隨機分佈的。用此方法所得到的快速排序一般稱為隨機的快速排序。隨機的快速排序與一般的快速排序演算法差別很小。但隨機化後,演算法的效能大大提高了,尤其是對初始有序的檔案,一般不可能導致最壞情況的發生。演算法的隨機化不僅僅適用於快速排序,也適用於其他需要資料隨機分佈的演算法。

平均時間複雜度:儘管快速排序的最壞時間為 O(n^2 ), 但就平均效能而言,它是基於關鍵字比較的內部排序演算法中速度最快的,快速排序亦因此而得名。它的平均時間複雜度為 O(n×lgn)。

空間複雜度:快速排序在系統內部需要一個棧來實現遞迴。若每次劃分較為均勻,則其遞迴樹的高度為 O(lgn), 故遞迴後所需棧空間為 O(lgn) 。最壞情況下,遞迴樹的高度為 O(n), 所需的棧空間為 O(n) 。

穩定性:快速排序是非穩定的。