Quicksort和Median使用相同的方法(Divide and conquer),为什么它们具有不同的渐近行为呢?
快速排序是否可能无法使用正确的转轴?
答案 0 :(得分:2)
当你在Quicksort中使用方法partition
(参见链接中的方法)来查找中位数时,方法返回具有正确位置的元素的索引,基于此位置,您只需要检查包含中位数的选定部分。
例如,数组长度为5,因此中位数为3.分区方法返回2,因此您只需要从2到5检查数组的上半部分,而不是整个数组作为Quicksort。
答案 1 :(得分:1)
如果您使用Hoare的原始select
算法,您可以获得与Quicksort相同的最差情况。
如果你使用中位数的中位数,那么你可以限制最坏的情况,但在大多数典型情况下都会以较慢的速度为代价。
你可以使用中位数的中位数来找到Quicksort的一个支点,它会产生大致相同的效果 - 限制最坏的情况,但在大多数情况下会以较慢的速度为代价。
当然,对于排序(一般情况下),每个分区操作都是O(N),并且您期望执行log(N)分区操作,因此您获得大约O(N log N)的总体复杂性。
使用中位数发现,您还希望执行大约O(log N)步骤,但您只考虑上一步骤中可能包含您关注的中位数(或四分位数等)的分区。您希望这些分区的大小在每个步骤中除以(大约)两个,而不是总是必须对整个输入进行分区,因此您最终会得到大约O(N)复杂度而不是O(N log N)。< / p>
[注意,在整个过程中,我有点滥用big-O表示法来表示预期的复杂性,而big-O实际上应该代表上限(即最坏情况)复杂性。]