Performance 快速排序:轴心元素的选择、输入和最坏情况下的性能有什么关系?
根据我在Performance 快速排序:轴心元素的选择、输入和最坏情况下的性能有什么关系?,performance,algorithm,pivot,quicksort,Performance,Algorithm,Pivot,Quicksort,根据我在quicksort上阅读的文章中所了解的情况,pivot元素的选择极大地影响了它是否以给定输入的最差性能运行 我问自己 随机化的pivot元素是否会简单地最小化(但不排除)在n^2 给定一个确定性枢轴元素,输入必须满足什么条件,例如,始终选择第一个元素作为枢轴,以便n^2成为现实 我将如何输入以使最坏情况下的性能变为现实 其他人给出了一个已经排序的数组的例子,可以是升序或降序,作为一个极端情况 我假设这与拆分过程、元素
quicksort
上阅读的文章中所了解的情况,pivot元素的选择极大地影响了它是否以给定输入的最差性能运行
我问自己
随机化的
pivot元素是否会简单地最小化(但不排除)在n^2
确定性枢轴元素,输入必须满足什么条件,例如,始终选择第一个元素作为枢轴,以便n^2
成为现实
拆分过程、元素
的指针(反之亦然)以及不利的pivot元素使拆分过程成本更高的方式有关
可能有人会在一个简单的示例中演示数组和[1,2,3]
以及pivot[0]
如何满足最坏情况下的性能,以便我可以看到所有这些是如何相互关联的
是的,随机化的pivot元素只会使最坏的情况变得不太可能
一个充分条件是,给定长度为n的数组,选择枢轴总是将其拆分为两个数组,其中一个数组的长度为O(1)
假设您有一些规则,在调用i时,算法选择位置v(n,i)处数组值的元素作为枢轴元素(您给出的示例是v(n,i)=0始终,即算法始终查看第一个元素)。然后设置:
值_0[v(n,0)]=0
值_1[v(n,1)]=1
值_2(v(n,2)]=2
其中,值_i是通过省略j
关于[1,2,3]的例子而pivot 0,据我所知,它没有很好的定义。使用固定的pivot元素无法获得完整的最坏情况示例,因为递归永远不会结束。不,随机化的pivot元素只是根据输入最坏情况的变化而变化。它不是一组较小的排列,只是一个不同的排列。然而,通常情况下,arra要排序的y已排序或大部分已排序,因此在实践中,第一个或最后一个元素作为轴心的情况是最坏的情况或非常糟糕的情况经常发生。长度θ(n)是什么意思?对不起,我(不幸的是,我还没有深入到形式主义中。你能解释一下它的含义或给出一个例子吗?谢谢!θ(n) 基本上是指“与成比例”。然而,请再看第2点,因为我将其修改为O(1),基本上是指“常数”。O(n^2)总是一个可能的现实。你只能影响它发生的几率。而“随机轴心”是胡说八道。相关:@HenkHolterman,有几种方法可以去除O(n^2)通过始终选择好的轴心,完全避免了这种情况——请参见@maxim1000——更常用的是中位数-3,中位数确实可以防止出现最坏的轴心,但代价很大。我不确定这是否仍然优于ShellSort等人。