在Quicksort中,为什么分区步骤从低 - 1和高+ 1开始?

时间:2016-06-29 06:59:29

标签: algorithm quicksort

考虑Hoare的分区方案......(来自wikiepdia

algorithm partition(A, lo, hi) is
    pivot := A[lo]
    i := lo – 1
    j := hi + 1
    loop forever
        do
            i := i + 1
        while A[i] < pivot

        do
            j := j – 1
        while A[j] > pivot

        if i >= j then
            return j

为什么最初是i = lo - 1而不是lo和j = hi + 1而不是hi?这不包括已经处于最终位置的先前枢纽吗?

我想首先理解这一点,因为我已经看到了一些不优化的情况。

3 个答案:

答案 0 :(得分:2)

(其他人已经解释过,初始左/右指针在数组之外的原因是这个算法版本首先分别递增和递减,使这些索引进入范围。)

  

这不包括已经处于最终位置的先前枢纽吗?

嗯,除了记录它之外,这个特殊的变化对枢轴值没有任何作用。

某些(大多数?)变体实际上将所选的枢轴元素移动到最左侧或右侧(当它不是其中之一时),然后从剩余的分区逻辑中排除该槽,最后将其交换为在循环结束时放置(中间位置)。

然而,这个特殊的变体只是依赖于分区循环来做它的事情,所以选择的枢轴元素可以在数组中移动几次,但最终会在正确的区域内结束。

答案 1 :(得分:1)

因为使用 执行 来增加i,并在第一次减少j。

所以我会很高兴,并且j在第一时间好。

如果你想指定i等于lo,j等于hi,你可以参考here

答案 2 :(得分:0)

因为do-while循环中的第一步是

i := i +1

因此它在第一次迭代中具有与lo相同的值。 之后,该算法检查A [i]&lt;枢

与j和hi相同

也可以这样做:

i := lo
j := hi

然后循环必须是面向头的:

while A[i] < pivot
    i := i +1
endWhile