我正在进行算法分配,这需要我用一个相同元素(1(a),1(b),1(c)等数组)显示快速排序算法的进展是数组中的最后一个元素。算法的递归部分令我感到困惑。到目前为止,我有进展:
1(a) 1(b) 1(c) 1(d) [1(e)]
1(a) | 1(b) 1(c) 1(d) 1(e)
1(a) 1(b) | 1(c) 1(d) 1(e)
1(a) 1(b) 1(c) | 1(d) 1(e)
1(a) 1(b) 1(c) 1(d) | 1(e)
在此之后,枢轴将变为1(d)我认为并且进展将与上述相同,除了少一次交换。我对左右递归调用如何工作感到困惑。将"右边的元素"阵列的一面是否与自己交换?该算法在什么时候停止?
这是伪代码:
QS(A, p, r):
if p < r
q = PARTITION(A, p, r)
QS(A, p, q - 1)
QS(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
exchange A[i] with A[j]
exchange A[i + 1] with A[r]
return i + 1
p是第一个元素数组,r是最后一个元素。
感谢您的帮助。
答案 0 :(得分:1)
在你的情况下,第二个电话QS(A, q + 1, r)
将始终为无操作,因为q
将始终等于r
,因此来电变为QS(A, r+1, r)
,if p < r
后卫变为无操作(p < r
将永远是假的。)
所以如果你的数组被索引为1,2,...,5; q
的第一个值是5,因此它的第一个递归调用是QS(A,1,4)
,第二个 - QS(A,6,5)
(无操作)。
QS(A,1,4)
也会发生同样的事情 - 它的q
将为4,而这两个电话会为QS(A,1,3)
和QS(A,5,4)
。
QA(A,1,5)
PARTITION(A,1,5) -> 5
QS(A,1,4)
PARTITION(A,1,4) -> 4
QS(A,1,3)
PARTITION(A,1,3) -> 3
QS(A,1,2)
PARTITION(A,1,2) -> 2
QS(A,1,1)
QS(A,3,2)
QS(A,4,3)
QS(A,5,4)
QS(A,6,5)
代码partition
的有趣方式,从未看到它以这种方式完成。我会在那里使用<
而不是<=
,而不是交换相等的元素。 (当然,在这里,所有掉期都是无操作的,在两个相等的指数之间;虽然不是一般情况下)。