了解荷兰国旗计划

时间:2012-06-26 18:51:47

标签: algorithm partitioning

我正在阅读Dutch national flag problem,但无法理解C ++实现中low函数中的highthreeWayPartition参数是什么。

如果我将它们视为要排序的数组的min和max元素,那么ifelse if语句从(data[i] < low)和{{1}开始没有任何意义总是返回零。

我哪里错了?

3 个答案:

答案 0 :(得分:10)

lowhigh是您为执行三向分区而定义的值,即执行三向分区,您只需要两个值:

[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)

lowhigh视为中间分区中值的半开放范围[low,high)。小于low的所有值最终都在左侧分区中。中间分区将包含low的值,但不包括high。最后,所有大于或等于high的值都会在右侧分区中结束。