快速排序 - 最坏情况

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

以上是关于快速排序 - 最坏情况的主要内容,如果未能解决你的问题,请参考以下文章

n个数排序,最坏情况下的最小交换次数是多少

快速排序

n个数排序,最坏情况下的最小交换次数是多少

快速排序小结

快速排序

快速排序