【发布时间】:2012-10-19 08:55:02
【问题描述】:
在最坏的情况下,快速排序递归深度需要 O(n) 的堆栈空间。为什么在最坏的情况下它不会导致大型集合的堆栈溢出? (倒序)
【问题讨论】:
-
使用第一个元素作为枢轴的快速排序实现是一个糟糕的实现。请注意,更好的方法是随机取一个元素或选择中间元素作为枢轴。
-
@amit:将中间元素作为枢轴也很糟糕,只是不那么糟糕,因为它更难构建杀手级输入。
-
@SteveJessop:我不同意。请注意,随机数组与任何选择都具有完全相同的“最坏情况”变化 - 作为随机选择的元素。选择第一个元素的问题是 - 对现实生活中的数组进行排序(或几乎排序)的概率不是
1/n!(您见过多少次使用已经排序的数组的代码?太多.. .),虽然我怀疑选择中间元素时最坏情况数组的概率会比1/n!(如果有的话)大得多。也就是说——如果你害怕攻击——那么应该避免任意选择。 -
可能我们之间的区别只是我认为默认情况下我应该害怕攻击,而您认为默认情况下不应该。我们甚至可能都是正确的,这仅取决于您正在编写的上下文,但我确实认为,对于像排序这样的通用实用程序操作,能够排除可能发生的攻击是非常罕见的。
标签: performance algorithm sorting data-structures quicksort