オランダ国旗問題を読んでいたのですが、C++実装の関数のlow
とhigh
引数が何なのか理解できませんでした。threeWayPartition
それらを並べ替える配列の最小要素と最大要素と仮定すると、if
andelse if
ステートメントは意味がなく、(data[i] < low)
and(data[i] > high)
は常にゼロを返します。
どこが間違っていますか?
オランダ国旗問題を読んでいたのですが、C++実装の関数のlow
とhigh
引数が何なのか理解できませんでした。threeWayPartition
それらを並べ替える配列の最小要素と最大要素と仮定すると、if
andelse if
ステートメントは意味がなく、(data[i] < low)
and(data[i] > high)
は常にゼロを返します。
どこが間違っていますか?
low
およびhigh
は、3方向パーティションを実行するために定義した値です。つまり、3方向パーティションを実行するには、2つの値のみが必要です。
[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