看了编程珠玑Programming Perls第11章关于快速排序的讨论,发现自己长年用库函数,已经忘了快排怎么写。于是整理下思路和资料,把至今所了解的快排的方方面面记录与此。
纲要
- 算法描述
- 时间复杂度分析
- 具体实现细节
- 划分
- 选取枢纽元
- 固定位置
- 随机选取
- 三数取中
- 分割
- 单向扫描
- 双向扫描
- Hoare的双向扫描
- 改进的双向扫描
- 双向扫描的其他问题
- 选取枢纽元
- 分治
- 尾递归
- 划分
- 参考文献
一、算法描述(Algorithm Description)
快速排序由C.A.R.Hoare于1962年提出,算法相当简单精炼,基本策略是随机分治。
首先选取一个枢纽元(pivot),然后将数据划分成左右两部分,左边的大于(或等于)枢纽元,右边的小于(或等于枢纽元),最后递归处理左右两部分。
分治算法一般分成三个部分:分解、解决以及合并。快排是就地排序,所以就不需要合并了。只需要划分(partition)和解决(递归)两个步骤。因为划分的结果决定递归的位置,所以Partition是整