我正在阅读荷兰国旗问题,但无法理解C++ 实现中函数中的low和high参数是什么。threeWayPartition
如果我假设它们是要排序的数组的最小和最大元素,那么ifandelse if语句就没有任何意义,因为(data[i] < low)它(data[i] > high)总是返回零。
我哪里错了?
我正在阅读荷兰国旗问题,但无法理解C++ 实现中函数中的low和high参数是什么。threeWayPartition
如果我假设它们是要排序的数组的最小和最大元素,那么ifandelse if语句就没有任何意义,因为(data[i] < low)它(data[i] > high)总是返回零。
我哪里错了?
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]分别作为底部、中间和顶部分区。
} else if (data[i] >= high) {表明您所看到的可能不是文章中所写的。
将low和high视为中间分区中值的半开范围[low,high)。所有小于的值low都在左分区中。中间分区将包含从low到 的值,但不包括high。最后,所有大于或等于的值都会high出现在正确的分区中。