给定数字列表: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)中中值的算法示例:-
介质的中值