具有相等元素的快速排序算法进程

时间:2016-03-25 22:51:11

标签: arrays algorithm quicksort

我正在进行算法分配,这需要我用一个相同元素(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是最后一个元素。

感谢您的帮助。

1 个答案:

答案 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的有趣方式,从未看到它以这种方式完成。我会在那里使用<而不是<=,而不是交换相等的元素。 (当然,在这里,所有掉期都是无操作的,在两个相等的指数之间;虽然不是一般情况下)。