简体   繁体   English

了解荷兰国旗计划

[英]Understanding Dutch National flag Program

I was reading the Dutch national flag problem , but couldn't understand what the low and high arguments are in the threeWayPartition function in the C++ implementation. 我正在阅读荷兰国旗问题 ,但无法理解C ++实现中threeWayPartition函数中的lowhigh参数是什么。

If I assume them as min and max elements of the array to be sorted, then the if and else if statements doesn't makes any sense since (data[i] < low) and (data[i] > high) always returns zero. 如果我将它们视为要排序的数组的最小和最大元素,那么ifelse if语句没有任何意义,因为(data[i] < low)(data[i] > high)总是返回零。

Where am I wrong? 我哪里错了?

low and high are the values you have defined to do the three-way partition ie to do a three-way partition you only need two values: lowhigh是您定义为执行三向分区的值,即执行三向分区,您只需要两个值:

[bottom] <= low  < [middle] < high <= [top]

In the C++ program what you are moving are the positions where the partitions occurred. 在C ++程序中,您要移动的是分区发生的位置。 A step-by-step example: 一步一步的例子:

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^

As the algorithm says you: 正如算法所说:

  • Swap the element above the bottom (ie p + 1 ) because everything below the bottom has been already checked, or 将元素交换到底部上方 (即p + 1 ),因为底部下方的所有内容都已经过检查,或者
  • Swap the element below the top (ie q - 1 ) because everything above the top has been already checked, or 交换元件下方的顶部(即, q - 1 ),因为所有上述顶部已经被选中,或
  • Leave the element where it is because it belongs to middle. 将元素保留在原来的位置,因为它属于中间。

You get [3, 1, 0, 2] , [6, 4] and [9, 8, 9] as bottom, middle and top partitions respectively. 您分别得到[3, 1, 0, 2][6, 4][9, 8, 9]作为底部,中部和顶部分区。

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

Think of low and high as the half-open range [low,high) for values in the middle partition. lowhigh视为中间分区中的值的半开范围[low,high) All values less than low end up in the left partition. 低于low所有值都在左侧分区中结束。 The middle partition will contain the values from low up to, but not including, high . 中间分区将包含从lowhigh但不包括high Finally, all values greater than or equal to high end up in the right partition. 最后,所有大于或等于high值都会在右侧分区中结束。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM