第二部分 排序和順序統計量
第7章 快速排序
- 快速排序最壞情況的時間複雜度爲Θ(n²)
- 但是快速排序是實際排序應用中最好的選擇,因爲它的平均性能非常好:它的期望時間複雜度是Θ(nlgn),而且Θ(nlgn)中隱含的常數因子非常小
- 原址排序
1. 快速排序的描述
與歸併排序一樣,也使用了分治思想
Quick-sort(A, p, r)
if p < r
q = Partition(A, p, r)
Quick-sort(A, p, q-1)
Quick-sort(A, q+1, r)
算法的關鍵部分是Partition過程,它實現了對子數組A[p..r]的原址重排。
Partition總是選擇一個x=A[r]作爲主元,並圍繞它來劃分子數組A[p..r]。隨着程序的執行,數組被劃分成4個區域。
Partition(A, p, r)
x = A[r]
i = p - 1
for j = p to r - 1
if A[j] <= x
i = i + 1
exchange A[i] width A[j]
exchange A[i+1] with A[r]
return i + 1
2. 快速排序的性能
快速排序的運行時間依賴於劃分是否平衡,而平衡與否又依賴於用於劃分的元素。劃分平衡與歸併排序性能一樣,否則,其性能接近於插入排序
- 最壞情況劃分,時間複雜度爲Θ(n²)
- 最好情況劃分,時間複雜度爲Θ(nlgn)
快速排序的平均運行時間更接近於其最好情況,而非最壞情況。
3. 快速排序的隨機化版本
隨機從子數組A[p..r]中隨機選擇一個元素作爲主元。爲達到這一目的,首先將A[r]與從A[p..r]中隨機選出的一個元素交換。
Randomized-Partition(A, p, r)
i = Random(p, r)
exchange A[r] with A[i]
return Partition(A, p, r)
Randomized-Quick-sort(A, p, r)
if p < r
q = Randomized-Partition(A, p, r)
Randomized-Quick-sort(A, p, q-1)
Randomized-Quick-sort(A, q+1, r)