1、它是排序中最佳的实用选择:平均性能相当好,Θ(nlgn),其中的常数因子很小
2、基于分治模式
3、就地排序
一、描述
初始化数据:A[p...q]
分治过程的三步骤:
分解:把A[p...q]划分为两个子数组:A[p...r-1]和A[r+1...q],其中满足,A[p..r-1]中每个元素 < A(r) < A[r+1...q]
解决:递归对子数据排序
合并:因为两个子数组是就地排序,故整个数组已排序
快速排序递归算法:
quickSort(A, p, q) {
if (p < q) {
r = partition(A, p, q) //取得划分值
quickSort(A, p, r-1)
quickSort(A, r+1, q)
}
}
划分过程:
partition(A, p, q) {
x = A[q] //取最后一个元素为基准
i = p-1
for (j=p to q-1) {
if (A[j] <= x) {
i ++
swap(A[i], A[j])
}
}
swap(A[i+1], A[q])
return i+1;
}
注:其中,A[p...i]是小区,A[i+1...j-1]是大区
二、性能分析
最坏:T(n) = T(n-1) + T(0) +Θ(n) = Θ(n2)
最好:T(n) = 2T(n/2) + Θ(n) = Θ(nlgn)
平均:T(n) = Θ(nlgn)