【发布时间】:2018-06-19 09:19:51
【问题描述】:
我正在阅读有关 QuickSort 的信息,看来理想情况下,他们使用随机算法来选择具有至少 25-75 个数组拆分的枢轴。 为什么他们不能计算数组的中值并在每次递归调用中选择最接近中值的值?
我认为这将花费相同的运行时间,甚至可能比随机方法更好。
【问题讨论】:
标签: algorithm sorting quicksort
我正在阅读有关 QuickSort 的信息,看来理想情况下,他们使用随机算法来选择具有至少 25-75 个数组拆分的枢轴。 为什么他们不能计算数组的中值并在每次递归调用中选择最接近中值的值?
我认为这将花费相同的运行时间,甚至可能比随机方法更好。
【问题讨论】:
标签: algorithm sorting quicksort
使用中位数的中位数,可以选择接近中位数,但开销很大,有效地对 5 个组进行排序。Wiki 文章:
https://en.wikipedia.org/wiki/Median_of_medians
请注意,中位数的中位数可以就地实现。
对于随机枢轴,计算随机索引的代码在分区步骤中会花费大量时间。
一种更简单的方法是使用 first、middle、last 的中位数,以避免已排序或反向排序数据的最坏情况时间,并且正如 yeputons 所回答的那样,使用切换到堆排序的 introsort(基于递归级别) 以避免最坏的情况。
【讨论】:
因为计算中值至少需要线性时间(与随机选择所需的恒定时间相比),并且在线性时间上并非易事。因此,即使保证了渐近性能,挂钟性能也会降低。我相信以其他方式保证性能更实际,例如通过使用Introsort。
【讨论】: