【问题标题】:Quick Sort Algorithm Progression With Equal Elements具有相等元素的快速排序算法进展
【发布时间】:2016-03-25 22:51:11
【问题描述】:

我正在处理一项算法作业,该作业要求我用一组相等的元素(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 是最后一个元素。

感谢您的帮助。

【问题讨论】:

标签: arrays algorithm quicksort


【解决方案1】:

第二次调用QS(A, q + 1, r),在您的情况下将始终是空操作,因为q 将始终等于r,因此调用变为QS(A, r+1, r)if p &lt; r 保护变为无操作(p &lt; 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 的编码方式很有趣,从未见过这种方式。我会在那里使用&lt; 而不是&lt;=,而不是交换相等的元素。 (当然,这里所有的交换也是空操作,在两个相等的索引之间;虽然不是一般情况)。

【讨论】:

  • 谢谢威尔。很好的解释!
猜你喜欢
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 2015-07-26
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
相关资源
最近更新 更多