繁体   English   中英

快速排序递归计数

[英]Quick Sort recursion count

使用快速排序对 n 个元素的列表进行排序的最小递归调用数是多少。 我无法理解实际调用了多少次递归函数,特别是“最小数量”是什么意思

快速排序是一组算法,其中数据集通过选择枢轴值、对数据进行分区并在分区上递归直到分区大小小于 2 来排序。

简单的实现使用第一个、最后一个或中间元素作为枢轴并将数据划分为 2 个集合:

  • 比较小于或等于基准的元素
  • 比较大于或等于基准的元素

高效的实现使用精心设计的方法来选择枢轴值并将数据划分为 3 组:

  • 比较小于枢轴的元素
  • 比较等于枢轴的元素
  • 比较大于枢轴的元素

他们也可能会切换到低于特定分区大小的不同算法,或者如果检测到病态分布,以避免二次时间复杂度。

对于 3 组实现,最佳情况是所有元素比较相等且不需要递归的情况。 这构成了递归调用的最小数量: 0

在其他情况下,递归调用的数量很大程度上取决于数据分布、枢轴选择方法和其他实现选择,例如:

  • 基本情况处理:在递归之前或进入函数时测试分区长度,
  • 切换到不同的算法,例如小分区的插入排序或病理分布的壳排序

平均而言,快速排序的递归调用次数约为:

  • 2n如果长度测试仅在函数的开头
  • n如果测试在递归之前执行
  • n/t如果切换到分区长度低于阈值t的另一种算法。

请注意,递归深度是一个不同但重要的问题,可以通过结合迭代和递归,在较小的分区上递归并在较大的分区上迭代,将其限制为log 2 (n)

另请注意,快速排序可以在没有递归的情况下实现,使用长度为log 2 (n)的小数组来跟踪待处理的分区。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM