快速排序 优化 详细分析

本文详细介绍了快速排序算法,包括算法描述、时间复杂度分析和具体实现细节。重点讨论了如何通过优化枢纽元的选择(如固定位置、随机选取、三数取中)和分割方法(单向扫描、双向扫描等)来提升排序效率,同时分析了分治策略中的尾递归优化。
摘要由CSDN通过智能技术生成

看了编程珠玑Programming Perls第11章关于快速排序的讨论,发现自己长年用库函数,已经忘了快排怎么写。于是整理下思路和资料,把至今所了解的快排的方方面面记录与此。

 

纲要

  1. 算法描述
  2. 时间复杂度分析
  3. 具体实现细节
    1. 划分
      1. 选取枢纽元
        1. 固定位置
        2. 随机选取
        3. 三数取中
      2. 分割
        1. 单向扫描
        2. 双向扫描
        3. Hoare的双向扫描
        4. 改进的双向扫描
        5. 双向扫描的其他问题
    2. 分治
      1. 尾递归
  4. 参考文献

一、算法描述(Algorithm Description)

快速排序由C.A.R.Hoare于1962年提出,算法相当简单精炼,基本策略是随机分治。
首先选取一个枢纽元(pivot),然后将数据划分成左右两部分,左边的大于(或等于)枢纽元,右边的小于(或等于枢纽元),最后递归处理左右两部分。
分治算法一般分成三个部分:分解、解决以及合并。快排是就地排序,所以就不需要合并了。只需要划分(partition)和解决(递归)两个步骤。因为划分的结果决定递归的位置,所以Partition是整

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值