我正在阅读Dutch national flag problem,但无法理解C ++实现中low
函数中的high
和threeWayPartition
参数是什么。
如果我将它们视为要排序的数组的min和max元素,那么if
和else if
语句从(data[i] < low)
和{{1}开始没有任何意义总是返回零。
我哪里错了?
答案 0 :(得分:10)
low
和high
是您为执行三向分区而定义的值,即执行三向分区,您只需要两个值:
[bottom] <= low < [middle] < high <= [top]
在C ++程序中,您要移动的是分区发生的位置。一步一步的例子:
data = [ 3, 1, 4, 9, 8, 2, 6, 9, 0 ]
low = 4
high = 8
[ 3 , 1 , 4 , 9 , 8 , 2 , 6 , 9 , 0 ]
p^ i^ q^
[ 3 , 1 , 4 , 9 , 8 , 2 , 6 , 9 , 0 ]
p^ i^ q^
[ 3 , 1 , 4 , 9 , 8 , 2 , 6 , 9 , 0 ]
p^ i^ q^
[ 3 , 1 , 4 , 9 , 8 , 2 , 6 , 9 , 0 ]
p^ i^ q^
[ 3 , 1 , 4 , 0 , 8 , 2 , 6 , 9 , 9 ]
p^ i^ q^
[ 3 , 1 , 0 , 4 , 8 , 2 , 6 , 9 , 9 ]
p^ i^ q^
[ 3 , 1 , 0 , 4 , 9 , 2 , 6 , 8 , 9 ]
p^ i^ q^
[ 3 , 1 , 0 , 4 , 6 , 2 , 9 , 8 , 9 ]
p^ i^ q^
[ 3 , 1 , 0 , 4 , 6 , 2 , 9 , 8 , 9 ]
p^ i^ q^
[ 3 , 1 , 0 , 2 , 6 , 4 , 9 , 8 , 9 ]
p^ iq^
算法告诉你:
p + 1
),因为底部的所有内容都已经过检查,或者q - 1
)换成,因为顶部的所有内容都已经过检查,或者您分别将[3, 1, 0, 2]
,[6, 4]
和[9, 8, 9]
作为底部,中间和顶部分区。
答案 1 :(得分:1)
} else if (data[i] >= high) {
表明您认为自己看到的内容可能不是文章中所写的内容。
答案 2 :(得分:0)
将low
和high
视为中间分区中值的半开放范围[low,high)
。小于low
的所有值最终都在左侧分区中。中间分区将包含low
的值,但不包括high
。最后,所有大于或等于high
的值都会在右侧分区中结束。