考虑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
?这不包括已经处于最终位置的先前枢纽吗?
我想首先理解这一点,因为我已经看到了一些不优化的情况。
答案 0 :(得分:2)
(其他人已经解释过,初始左/右指针在数组之外的原因是这个算法版本首先分别递增和递减,使这些索引进入范围。)
这不包括已经处于最终位置的先前枢纽吗?
嗯,除了记录它之外,这个特殊的变化对枢轴值没有任何作用。
某些(大多数?)变体实际上将所选的枢轴元素移动到最左侧或右侧(当它不是其中之一时),然后从剩余的分区逻辑中排除该槽,最后将其交换为在循环结束时放置(中间位置)。
然而,这个特殊的变体只是依赖于分区循环来做它的事情,所以选择的枢轴元素可以在数组中移动几次,但最终会在正确的区域内结束。
答案 1 :(得分:1)
答案 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