快速排序通常是實際應用中最好的選擇,因為它的平均效能非常好,它的期望時間複雜度為o(nlng), 而且隱含的常數因子非常小。另外,它還是原址排序。
quicksort(a, p, r)
if p隨著程式的執行,陣列被劃分為4個(小於主元,大於主元,未劃分,主元,可能有空的)區域。對於partition中的第3~6行,for迴圈的每一輪迭代的開始,每乙個區域都滿足一定的性質,我們可以將這些性質作為迴圈不變數:
對於partition函式,想象一下這個過程,j在不斷的向後跑去看各個元素,i則停留在了大於x的元素的前面,當j找到了乙個比x小的元素的時候,我們就將這個比x小的元素和i+1位置上比x大的元素進行交換,然後在進行j的下一次迭代的時候,這樣確保了1~i的所有元素全部是小於等於x的,而i+1~j的元素全部都是大於x的,j到r的元素還沒有進行排序。
快速排序的執行時間依賴於劃分是否平衡,二平衡與否又依賴於劃分的元素。如果劃分是平衡的,則效能於歸併排序一樣。如果劃分是不平衡的,則效能接近於插入排序。
在討論快速排序的平均情況效能的時候,我們的前提假設是:輸入資料的所有排列都是等概率的。但實際工程中這並不總是成立的。有時我們可以引入隨機性,從而使得演算法對於所有的輸入都能獲得較好的期望效能。很多人都選擇隨機化版本的快速排序。
我們通過顯式地對輸入進行重新排列,使得演算法實現隨機化。
randomized-partitioin(a, p, r)
i=random(p, r)
exchange a[r] with a[i]
return partition(a, p, r)
randomized-quicksort(a, p, r)
if pq=randomized-partition(a, p, r)
randomized-quicksort(a, p, q-1)
randomized-quicksort(a, q+1, r)
演算法導論 第七章《快速排序》
本章介紹了快速排序及其演算法分析,快速排序採用的是分治演算法思想,對包含n個數的輸入陣列,最壞情況下執行時間為 n 2 但是平均效能相當好,期望的執行時間為 nlgn 另外快速排序能夠就地排序 我理解是不需要引入額外的輔助空間,每次劃分能確定乙個元素的具體位置 在虛擬環境中能很好的工作。快速排序演算...
演算法導論第七章快速排序
一 快速排序概述 關於快速排序,我之前寫過兩篇文章,一篇是寫vc庫中的快排函式,另一篇是寫了快排的三種實現方法。現在再一次看演算法導論,發現對快速排序又有了些新的認識,總結如下 1 快速排序最壞情況下的時間複雜度為o n 2 雖然最壞情況下效能較差,但快排在實際應用中是最佳選擇。原因在於 其平均效能...
演算法導論 第七章 快速排序
1.快速排序描述 基於分治模式,分為分解 解決和合併三部分 1 分解 將陣列a p.r 劃分為兩個子陣列a p.q 1 和a q 1.r 是的a p.q 1 中每個元素都小於或等於a q 2 解決 通過遞迴呼叫快速排序,對子陣列a p.q 1 和a q 1.r 排序 3 合併 合併兩個有序的陣列,a...