2

このスニペット コードとクイックソートの実装を見てください。これは本Data Structures and Problem Solving Using Javaからのものです。

    int i, j;

    for(i = low, j = high -1;;){

        while(array[++i].compareTo(pivot) < 0)
            ;
        while(pivot.compareTo(array[--j]) < 0)
            ;
        if(i >= j)
            break;
        swapReferences(array, i, j);
    }

これがどのように機能するかを理解するのに少し苦労しています。私の理解では、for ループは開始点を宣言するだけで、for ループをいつ終了するかについての規則は含まれていません。それは if 文で処理されますが、正しいですか? また、角かっこがないと、while ループがよくわかりません。セミコロンとインデントの欠如は、それらがネストされていないことを示唆しています。しかし、ループ内に実際のコードはありません。各 while が別個であると言うのは正しいですか。1 つは低い値をピボットと比較し、もう 1 つは高い値を比較し、while ループの各基準が満たされたときに交換します。i がインクリメントされ、j がデクリメントされるたびに for ループがプロセスを続行し、if ステートメントの基準が満たされるまで、その時点で for ループから抜け出すのでしょうか? これは正しいです?

編集:本の内容を正確に反映するようにコードを更新しました。

4

4 に答える 4

6

あなたの分析は正しいです。ループは、 と を使用whileして暗黙的に作業を++i行い--jます。より明確にするために、次のように書き直すことができます。

do i++; while (array[i] < pivot);
do j--; while (pivot < array[j]);
于 2013-01-15T09:52:38.920 に答える
0

while ループは空です。実際の作業は、述語内のインクリメント演算子とデクリメント演算子で行われます。

for ループは実質的に無限ループでもあり、i >= j の場合にのみ break ステートメントによって終了します。

そのわずかに奇妙な構文 - このように書くかどうかはわかりません - 時期尚早の最適化かもしれません...

于 2013-01-15T09:52:25.823 に答える
0

はい、あなたの評価は正しいです。

境界条件とステップ ディレクティブを省略することは、それほど珍しいことではありません。あなたも見る

for (;;) {
...
}

多くの場合、無限ループを構築します。余談ですが、より厳密なコード規則 (NASA、ミッション クリティカルなリアルタイム システム) では、コード内の無限ループが明示的に禁止されています。

このwhile構文は合法ですが、非常に醜いです。チームの誰かからコードをレビューしている場合、私はその構成を受け入れません。1 つには、たとえ 1 行だけであっても、すべての条件ブロックとループ ブロックを中括弧で囲むことを非常に厳格に定めています。

この構文的に正当な構成を検討し、それが何をするかを熟考してください

int i = 0;
while (i++ < 10)                                                                ;
{
    System.out.println(i);
}
于 2013-01-15T10:01:38.617 に答える
0

ここでは、for ループは初期化に使用されているだけです。for ループで指定されたインクリメントやルールはありません。つまり、for ループは、ブレーク ステートメントに到達するまで続行されます。

while(array[++i] - ピボット < 0); これは、各ステップ i が 1 ずつインクリメントされ、条件がチェックされることを意味します。この while ループは、(array[++i] - pivot ) が 0 以上になるまで続きます。その後、実行は次の while ループ while(pivot - array[--j] < 0) この while ループは、(pivot - array[--j] ) が 0 以上になるまで続きます。その後、if 条件をチェックします。満たされている場合は、から抜けます。ループのメイン。それ以外の場合、swapReferences 関数が実行され、for ループが続行されます。

于 2013-01-15T10:19:30.590 に答える