4

我正在阅读荷兰国旗问题,但无法理解C++ 实现中函数中的lowhigh参数是什么。threeWayPartition

如果我假设它们是要排序的数组的最小和最大元素,那么ifandelse if语句就没有任何意义,因为(data[i] < low)(data[i] > high)总是返回零。

我哪里错了?

4

3 回答 3

9

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]分别作为底部、中间和顶部分区。

于 2012-06-26T19:33:51.810 回答
1

} else if (data[i] >= high) {表明您所看到的可能不是文章中所写的。

于 2012-06-26T18:54:22.810 回答
0

lowhigh视为中间分区中值的半开范围[low,high)。所有小于的值low都在左分区中。中间分区将包含从low到 的值,但不包括high。最后,所有大于或等于的值都会high出现在正确的分区中。

于 2012-06-26T19:17:45.510 回答