快速排序,是否有最佳的支点?

时间:2013-11-18 16:17:36

标签: algorithm sorting quicksort

鉴于数字列表: 2 5 1 8 4 10 6 3 7 9 0

我理解的快速排序的实际实现,但我的作业中我没有的问题是:

枢轴的最佳选择是什么?为什么?

我在读这篇文章时已经假定,对于一个枢轴的明显选择是5或6,因为它位于列表的中间。我认为快速排序可以工作,因为我们每次都选择一个新的数据透视表。这使得后续问题更有意义,但是有没有人有正式的定义?

为什么最佳枢轴不实用?

3 个答案:

答案 0 :(得分:5)

最佳数据透视表是您当前正在处理的集合的中位数,因为它会将该集合拆分为两个大小相等的子集,以保证O(n log n)性能。它不实用的原因是因为找到实际中位数的成本。你基本上必须对数据进行排序以找到中位数,所以它就像书Catch 22 - “我如何对数据进行排序?” “找到中位数”“我如何找到中位数?” “对数据进行排序”。

答案 1 :(得分:1)

最佳枢轴位于中间,因为当您将其向左或向右移动(或采用最大或最小的项目)时,会增加递归的深度。在最坏的情况下,除了O(n * log2(n))时,你将得到O(n ^ 2)。

答案 2 :(得分:1)

最佳枢轴必须是数字的中位数,因为那时子问题的大小恰好是原始数据的一半。时间复杂度定义如下: -

 T(N) = T(N/2) + O(N)

    which evaluates to

    T(N) = O(NlogN)

然而,如果在分区之后最终成为数组的第一个元素,那么: -

T(N) = T(N-1) + O(N) 

T(N) = O(N^2)

与冒泡排序一样糟糕

使用中值始终作为枢轴的原因是不实际的,因为在O(N)中执行它的算法非常复杂&你总是可以在O(NlogN)中做到这一点,但这又是排序,这是我们正在解决的问题。以下是评估O(N)中位数的算法示例: -

Median of Medians