簡體   English   中英

了解荷蘭國旗計划

[英]Understanding Dutch National flag Program

我正在閱讀荷蘭國旗問題 ,但無法理解C ++實現中threeWayPartition函數中的lowhigh參數是什么。

如果我將它們視為要排序的數組的最小和最大元素,那么ifelse if語句沒有任何意義,因為(data[i] < low)(data[i] > high)總是返回零。

我哪里錯了?

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]作為底部,中部和頂部分區。

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

lowhigh視為中間分區中的值的半開范圍[low,high) 低於low所有值都在左側分區中結束。 中間分區將包含從lowhigh但不包括high 最后,所有大於或等於high值都會在右側分區中結束。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM