快速排序,是否存在最佳的枢轴



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

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

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

当我读到这篇文章时,我假设枢轴的明显选择是5或6,因为它位于列表的中间。我认为快速排序无论哪种方式都可行,因为我们每次都会选择一个新的枢轴。这使得后续问题更有意义,但有人有正式的定义吗?

为什么最佳支点不实用?

最佳枢轴是您当前处理的集合的中值,因为它会将集合拆分为两个大小相等的子集,从而保证O(n log n)性能。它不实用的原因是因为找到实际中值的成本。你基本上必须对数据进行排序才能找到中位数,所以这就像《Catch 22》一书——"我如何对数据排序?"找到中位数"我如何找到中位数?"对数据排序"。

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

最优枢轴必须是数字的中值,因为这样子问题的大小正好是原始问题的一半。时间复杂性定义如下:-

 T(N) = T(N/2) + O(N)
    which evaluates to
    T(N) = O(NlogN)

而如果pivot最终成为分区后数组的第一个元素,则:-

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

它和气泡分类一样糟糕

使用中值始终作为枢轴的原因是不实际的,因为在O(N)中执行该操作的算法是非常复杂的&u总是可以在O(NlogN)中完成,但这是再次排序,这是我们正在解决的问题。以下是评估O(N)中中值的算法示例:-

介质的中值

最新更新