算法导论 第7章 快速排序

算法导论 第7章 快速排序

快速排序 是一种最坏情况时间复杂度Θ(n2),但平均时间复杂度Θ(nlgn)的排序算法,且Θ(nlgn)中隐含的常数因子非常小。它还能进行原址排序,占用空间小,所以在实际应用中通常是最好的选择。

算法

快速排序与归并排序一样也使用了分治思想:

  • 分解:将数组A[p…r]划分为两个子数组(可能为空):A[p…q-1]和A[q+1…r],使A[p…q-1]中每个元素都小于等于A[q],A[q+1…r]中每个元素都大于等于A[q]
  • 解决:通过递归调用,对子数组A[p…q-1]和A[q+1…r]进行排序
  • 合并:因为原址排序,不需要合并操作

算法导论 第7章 快速排序

其中PARTITION过程实现了对子数组的原址重排:
算法导论 第7章 快速排序

其执行过程:
算法导论 第7章 快速排序

性能

当划分产生的两个子问题分别包含n-1个元素和0个元素时为最坏情况,若每次递归调用都出现最坏划分,则递归式为:
算法导论 第7章 快速排序
其解为Θ(n2)。

当划分产生的两个子问题规模都不大于n/2,这种情况下快速排序的性能最好,递归式为:
算法导论 第7章 快速排序
其解为Θ(nlgn)。

快速排序的平均运行时间更接近于其最好情况,实际上任何一种常数比例的划分都会产生运行时间O(nlgn)。且当差的划分和好的划分交替出现时时间复杂度与全是好的划分时一样,区别只是隐含的常数因子。

随机化版本

在实际应用中,为避免输入数据的排列对算法性能的影响会先引入随机性。对于快速排序可以使用随机抽样的方法,不直接使用A[r]作为分割元,而是随机抽取一个元素:
算法导论 第7章 快速排序
算法导论 第7章 快速排序