快速排序 - 最坏情况
Posted
技术标签:
【中文标题】快速排序 - 最坏情况【英文标题】:Quicksort - Worst case condition 【发布时间】:2014-10-23 22:02:08 【问题描述】:我看到以前有人问过类似的问题,但我已经搜索了一段时间,似乎找不到答案。
我现在的任务是使用快速排序算法对一个包含 7 个字母的简单数组进行排序。 我们需要显示排序的每一步,每次都强调枢轴。 我们的讲师要求我们使用最右边的值作为每一步的支点。 基于这个视频,https://www.youtube.com/watch?v=aQiWF4E8flQ,这是我目前所拥有的(以粗体显示):
GACEFBD
A|GCEFBD
AC|GEFBD
ACB|EFGD
ACBD|FGE
但我不确定从这里去哪里。在分区的左侧,D 是枢轴,但没有大于 D 的值。那么枢轴到哪里去了? 我看过的每个教程都使用 3 的中位数作为枢轴,或者最左边,而我并不是最擅长算法的。
B 部分让我们展示了使用相同规则排序 ABCDEFG 的每一步。不知道从哪里开始,因为我有同样的问题。 对不起,如果这是一个愚蠢的问题。
【问题讨论】:
嗯,你有一个像选择轴一样的东西。在纸上效果很好,而不是在二进制数组中。在实际代码中,我们使用不同的枢轴策略。不过与你的作业无关。 在我们提供的代码中,枢轴是通过查找数组的中值来选择的,这是有道理的。我认为我们的教授希望我们将轴心更改为最右边的值,以说明最坏情况的运行时间。 【参考方案1】:考虑每次迭代会发生什么。
请记住,快速排序的工作原理如下:
-
如果数组为空,返回一个空数组并退出
如果数组只有一个入口,返回入口并退出
选择一个支点
将数组拆分为三个子数组:
小于基准的值
枢轴
大于基准的值
对于每个非空数组,再次应用快速排序并连接结果数组
(我知道我在模糊地使用“数组”这个词......但我认为这个想法很清楚)
我认为您遗漏了一个简单的事实:一旦您选择了枢轴,您将它放在正确的位置,并对其他数组应用快速排序...您不需要再次对枢轴应用快速排序。
假设您有一个名为 QuickSort(Array, Pivot)
的函数,并假设您始终将数组的最左侧条目作为枢轴:
QuickSort(GACEFBD , D)
第一。迭代:[QuickSort(ACB, B), D, QuickSort(GEF, F)]
如您所见,最右边的值可以是“好的”支点。
在第一次迭代之后,D
已经在正确的位置
[[QuickSort(A,A), B, QuickSort(C,C)], D, [QuickSort(E,E), F, QuickSort(G,G)]]
[A, B, C, D, E, F, G]
妙语:即使您取数组最右边的条目,也可能存在该条目是“好”枢轴值的情况。
真正的最坏的情况是对已经排序的数组应用快速排序。但同样的规则适用。尝试将上述过程应用于以下内容:QuickSort(ABCDEFG, G)
【讨论】:
那么在 QuickSort(ABCDEFG, G) 的情况下,数组的内容实际上不会改变位置吗?那么它会变成 QuickSort(ABCDEF,F),G,然后是 QuickSort(ABCDE,E),F,G 等等? @Jackson 没错...很容易看出为什么这是真正的最坏情况,你不觉得吗? ;-) 是的!它必须分解每个元素的数组,并进行 n-1 比较。谢谢!! @Jackson Quicksort 的平均性能为O(n * log(n) )
,最差的性能为 O(n²)
。 See here以上是关于快速排序 - 最坏情况的主要内容,如果未能解决你的问题,请参考以下文章