查找quickSort算法的所有透视值

时间:2017-10-17 06:48:20

标签: algorithm quicksort partitioning

我似乎对Quick Sort的正确实现感到有些困惑。

  

如果我想找到QuickSort的所有透视值,我在什么时候停止分割子阵列?

QuickSort(A,p,r):
    if p < r:
        q = Partition(A,p,r)
        Quicksort(A,p,q-1)
        Quicksort(A,q+1,r)

Partition(A,p,r):
    x = A[r]
    i = p-1
    for j = p to r-1:
    if A[j] ≤ x:
        i = i + 1
        swap(A[i], A[j])
    swap(A[i+1], A[r])
    return i+1

意思是,如果我有一个数组: A = [9,7,5,11,12,2,14,3,10,6]

快速排序将其分解为构成部分......

A = [2,5,3] [12,7,14,9,10,11]

再一步到达混乱点......

A = [2,5] [7,12,14,9,10,11]

左边的subArray会停在这里吗?或者它(quickSort)最后调用quickSort,5作为最终的枢轴值?

对我来说,在所有子阵列都是单项之前我们会继续这样做是有道理的 - 但是我的一位同事一直在告诉我。

1 个答案:

答案 0 :(得分:1)

您的示例的支柱将是:6, 3, 11, 10, 9, 12。关于

  

左边的subArray会停在这里吗?

最好检查源代码。当递归子数组变为[2, 5, 3]时,将使用QuickSortp = 0调用函数r = 2。我们继续:Partition(A,0,2)将返回q = 1,因此接下来的两个来电将是Quicksort(A,0,0)Quicksort(A,2,2)。因此,永远不会调用Quicksort(A,0,1),因此您永远不会有机会检查子数组[2, 5] - 它已经被排序了!