为什么在quicksort中选择随机数据透视表

时间:2015-05-01 02:40:13

标签: algorithm sorting quicksort

因此,在最坏的情况下随机选择一个枢轴O(n 2 ),但是当选择枢轴作为列表的最小值和最大值的平均值时,您会得到最坏的情况O (n log n)。

当然,由于找到最小值和最大值而不是随机生成器的常数O(1),因此每次递归都会增加2 * O(n)。当将其实现为数据透视表时,您将获得在递归树的叶子处排序的列表,而不是在标准算法元素中从根到叶子进行排序。

当实现代替枢轴作为列表中的值时,它只是一个数字,因此这不是标准的快速排序,但我的问题仍然适用。

下面是我写得不好的伪代码:

func sort(List n):
    if n.length < 2
     return n;
    min = n.minValue
    max = n.maxValue
    avg = (min+max) /2 
    List left = list of elements in n less than avg
    List right = list of elements in n greater than avg
    sort(left)
    sort(right)

2 个答案:

答案 0 :(得分:3)

如果在列表包含以下元素时选择min值和max值的平均值,则算法会遇到O(n 2 ):

  

1,3,7,15,31,63,...,2 n -1

您可以发现,对于算法的每次传递,right部分始终只有1个元素。

答案 1 :(得分:0)

三件事:

  1. 您可以在列表的一次传递中获得最大值和最小值,因此实际上我们为每次传递添加1 * O(n)。然而...

  2. max和min的平均值不保证O(nlog(n)),因为最大值和最小值的平均值不一定是中值。如果你有一个已经排序的列表(1,10,100,1000,10000),这实际上会给出一个O(n ^ 2)解决方案,这对已经排序的列表非常不利(并且很可能发生)。

  3. 从统计上来说,选择一个随机数据可能会给你一些接近中位数的东西。从列表中取一个随机数,50%的时间这个数字位于列表的中间50%,这意味着在最坏的情况下,它有75%的列表到一侧,25%在另一侧。当我们选择接近真实的中位数时,显然性能会更好。