演算法導論學習筆記(七) 快速排序

2021-09-24 14:25:24 字數 1210 閱讀 5253

快速排序是乙個使用分治思想的排序演算法,具有如下優點:

1. 演算法的期望執行時間為θ(nlgn),且其中蘊含的常數因子較小,故而快速排序演算法通常是實際應用中最好的選擇。

2. 原址排序,排序過程中只需要有限個輔助空間。

快速排序通過分治的演算法設計思想,借助關鍵子過程partition將輸入(這裡假定演算法的輸入為互異關鍵字key組成的整型陣列)劃分為比主元小和大的兩部分,主元可以隨機選擇也可以選擇陣列特定index位置的key。其中,分治的思想如下:

(1) 分解:借助partition子過程將輸入陣列分解為比主元小和大的兩部分。

(2) 解決:對這兩部分遞迴的呼叫快速排序使其有序。

(3) 合併:由於是原址排序,故合併步驟可以省略。

演算法的偽**如下:

quicksort(a, p ,r)

//演算法的邊界條件

if(p < r)

//演算法的關鍵過程,通過呼叫partition將輸入劃分為主元小和大的兩部分

q=partition(a,p,r)

//對比主元小的這一部分遞迴呼叫快速排序使用有序

quicksort(a,p,q-1)

//對比主元大的這一部分遞迴呼叫快速排序使其有序

quicksort(a,q+1,r)

partition(a,p,r)

//主元

pivot = a[p]

//比主元pivot小的區域的終止下標,同時也是兩個部分的交界點

j = p;

//陣列下標從 p + 1 到 r的元素與主元pivot進行比較

for( i = p + 1 to r)

//如果陣列元素小於主元,則將終止下標+1的陣列元素與a[i]交換

if(a[i] < pivot)

j++swap(a[j],a[i])

//結束時將主元放在合適的位置

swap(a[j+1],a[p])

快速排序的期望執行時間為θ(nlgn),最壞情況執行時間為θ(n2),在實際使用過程中快速排序的平均執行時間更接近於其最好的情況而不是最壞情況執行時間。快速排序的執行時間依賴於partition函式對陣列的劃分是否平衡,在最平衡的劃分下,原問題被分解為規模為 [n/2」的子問題,其執行時間為θ(nlgn)。而在最不平衡的劃分下,原問題被分解為0和n -1的兩個子問題,演算法取得最壞情況執行時間θ(n2),此外在輸入已經完全有序的情況下,演算法也取得最壞情況執行時間。

演算法導論學習筆記 第七章 快速排序

第七章 快速排序 總結 這章講了快速排序的演算法,分析了演算法複雜性,又講了快速排序的隨機版 1.快速排序 partition a,p,r 將a p r 進行就地重排,返回 q,其中 a p q 1 中的元素都小於 a q a q 1,r 中的元素都大於 a q quicksort a,p,r 遞迴...

演算法導論之快速排序 學習筆記

或者你也可以打個比喻,想象一下,假設r為主元素,j元素為前方開路元素,和主元素進行比較,如果大於主元素則繼續開路 如果小於主元素則i元素加1之後和j元素交換之後,j元素繼續開路直到最後。書中給出了劃分的偽 1 partition a,p,r 2 x a r 將最後乙個元素作為主元素 3 i p 1 ...

學習演算法導論 快速排序

快速排序用的也是分治法,快速排序分為三個步驟 1.分解 陣列a low.high 被劃分為兩個 可能為空 的子陣列a low.q 1 和a q 1.high 使得a low.q 1 中的每個元素都小於等於a q 而a q 小於等於a q 1.high 中的每個元素。q是乙個劃分點。2.解決 通過遞迴...