算法导论学习笔记 第7章 快速排序
1 快速排序的描述
與歸并排序一樣,快速排序也使用了分治法的思想,下面是對一個典型的子數組A[p.. r]進行快速排序的分治過長:
分解:數組A[p.. r]被劃分為兩個(可能為空)子數組A[p.. q-1]和A[q+1.. r],使得A[p.. q-1]中的每一個元素都小于A[q],而A[q+1.. r]中的每個元素都大于?A[q]。q也是劃分過程的一部分。
解決:通過遞歸調用快速排序,對子數組A[p.. q-1]和A[q+1.. r]進行排序
合并:因為子數組都是原址排序的,所以不需要合并,數組A[p.. r]已經排序。
下面是快速排序的為代碼:
QUICKSORT(A, p, r) 1 if p<r 2 q = PARTITION(A, p, r) 3 QUICKSORT(A, p, q-1) 4 QUICKSORT(A, q+1, r)為了排序一個數組A的全部元素,初始調用QUICKSORT(A, 1, A.length)。
2 數組的劃分
算法的關鍵部分是PARTION過程,他實現了對子數組A[p.. r]的原址排序。PARTION的偽代碼表示如下:
PARTION(A, p, r) 1 x = A[r] 2 i = p - 1 3 for j=p to r-1 4 if A[u]<=x 5 i = i +1 6 exchange A[i] with A[j] 7 exchange A[i+1] with A[r] 8 return i + 1 下圖表示了PARTION如何在一個包含8個元素的數組上進行操作的過程。PRATION總是選擇一個x=A[r]作為主元(pivot element),并圍繞它來劃分數組A[p.. r] 。
PRTION在子數組A[p.. r]上的實際復雜度是O(n),其中n = r - p +1。
3 快速排素的性能
快速排序的運行時間依賴于劃分是否平衡,而平衡與否又依賴于劃分的元素。如果劃分是平衡的,那么快速排序算法性能與歸并排序一樣,如果劃分是不平衡的,那么快速排序的性能就接近與插入排序了,下面給出了快速排序性能的非形式化的分形:
最壞情況的劃分:
? 當劃分產生的兩個子問題分別包含了n-1個元素和0個元素是,快速排序的最壞情況發生了。不妨假設算法的每一次遞歸調用都出現了這種不平衡的劃分。劃分操作的時間復雜度是O(n)。由于對一個大小為0的數組遞歸調用誰直接返回,因此,T(0)=O(1),于是算法運行時間的遞歸式可以表示為:
T(n) = T(n-1) + T(0) + O(n) = T(n-1) + O(n)
? 利用帶入法可以直接得到遞歸式的解為T(n) = O(n^2)。因此,如果在算法的每一層遞歸上,劃分都是最大程度不平衡,那么算法的時間復雜度為O(n^2)。
最好情況的劃分
? 在可能的最平衡的劃分中,PARTION得到的兩個字問題的規模都不大于n/2。這是因為一個子問題的規是n/2,而另一個字問題的規模為n/2 - 1。此種情況下,快速排序的性能非常好。此時,算法的運行時間的遞歸式為:
T(n) = T(n/2) ?+ O(n)
由主定理可知,上述遞歸式的解為O(nlgn)。
平衡的劃分
快速排序的平均運行時間更接近于其最好情況,而非最壞情況。假設的算法總是產生9:1的劃分,乍一看,這種劃分是很不平衡的。這時候得到的快速排序的時間復雜度的遞歸為:
T(n) = T(9n/10) + T(n/10) + cn
書中采用了遞歸樹的方式求出了上述遞歸的解為O(nlgn)。而且指出,只要劃分是常數比例的,算法的運行時間總是O(nlgn)。
總結
以上是生活随笔為你收集整理的算法导论学习笔记 第7章 快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法导论学习笔记 6.5 优先队列
- 下一篇: 基于R语言的梯度推进算法介绍