7.1 快速排序的描述
快速排序是基于divide-and-conqueue模式的。
快速排序算法的关键是PARTITION过程,它对子数组A[p..r]进行就地重排:
在函数PARTITION中的每一次循环中,对于任意数组下标k,有
1) 如果p<= k <=i,则A[k] <= x;
2) 如果i+1 <= k <=j-1,则A[k] > x;
3) 如果k = r,则A[k] = x。
PARTITION在子数组A[p..r]上的运行时间为θ(n),其中 n=r-p+1
7.2 快速排序的性能
最坏情况划分
快速排序的最坏情况划分行为发生在划分过程产生的两个区域分别包含n-1个元素和0个元素的时候。假设算法的每一次递归调用中都出现了这种不对称划分,则算法的运行时间可以递归地表示为:
T(n) = T(n-1) + T(0) + θ(n) = T(n-1) + θ(n)
利用代换法,可以证明T(n) = θ(n^2)
最佳情况划分
在PARTITION可能做的最平衡的划分中,得到的两个子问题的大小都不可能大于n/2。在这种情况下,快速排序的运行时间为:
T(n) <= 2T(n/2) + θ(n)
根据主定理,该递归式的解为T(n) = O(nlgn)
平衡的划分
任何一种按常数比例进行的划分都会产生深度为θ(n)的递归树,其中每一层的代价为O(n),因而,每当按常数比例进行划分时,总的运行时间都是O(nlgn)。
7.3 快速排序的随机化版本
7.4 快速排序分析
快速排序最坏情况运行时间为θ(n^2)
利用RANDOMIZED-PARTITION,快速排序期望的运行时间为O(nlgn)。
快速排序的c代码: