我似乎对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作为最终的枢轴值?
对我来说,在所有子阵列都是单项之前我们会继续这样做是有道理的 - 但是我的一位同事一直在告诉我。
答案 0 :(得分:1)
您的示例的支柱将是:6, 3, 11, 10, 9, 12
。关于
左边的subArray会停在这里吗?
最好检查源代码。当递归子数组变为[2, 5, 3]
时,将使用QuickSort
和p = 0
调用函数r = 2
。我们继续:Partition(A,0,2)
将返回q = 1
,因此接下来的两个来电将是Quicksort(A,0,0)
和Quicksort(A,2,2)
。因此,永远不会调用Quicksort(A,0,1)
,因此您永远不会有机会检查子数组[2, 5]
- 它已经被排序了!