シーケンステーブルについて説明した後、そのアプリケーションであるクイックソートアルゴリズムを見てみましょう。
データのアルゴリズムは次のとおりです。
public void QuickSort(SeqList <int> sqList、int low、int high)
{ int i = low; int j = high; int temp = sqList [low]; while(low <high) { while(low <high && sqList [high]> = temp) {- high; } sqList [low] = sqList [high] ++ low while(low <high && sql [low] <= temp) { ++ Low } sqList [high] = sqList [low]; - 高い; } sqList [low] = temp; if(i <low-1) {
QuickSort(sqList、i、low-1);
}
if(j> low + 1)
{ QuickSort(sqList、high + 1、j); }
}
変更されたコードは次のとおりです。
public void QuickSort(SeqList <int> sqList、int low、int high)
{ int i = low; int j = high; int temp = sqList [low]; while(low <high) { while(low <high && sqList [high]> = temp) {- high; }
if(低<高)
{ sqList [low] = sqList [high] ++ low
}
while(low <high && sql [low] <= temp)
{ ++ Low }
if(低<高)
{ sqList [high] = sqList [low]; - 高い;
}
}
sqList [low] = temp;
if(i <low-1)
{ QuickSort(sqList、i、low-1); } if(j> low + 1) { QuickSort(sqList、high + 1、j); }
}
内側のwhileループの後の2つの文だけがif判定条件で追加されていることがわかります。これは何を求めているのでしょうか。
まず、次のテストケースを見てください。
渡されたsqlistが1、3、2であるとします。データにコードを使用すると、3、1、2の結果が得られます。
その理由は、第1層のwhileループに入った後に第2層の最初のwhileステートメントが実行された場合、whileの終了は、sqList [high]> = tempの条件が原因ではなく、high == lowが原因であるためです。満たされていない、つまり、このwhileステートメントの最後で、high == lowが最初の要素1を指している場合、whileループを終了し、次のステートメントを実行します。
sqList [low] = sqList [high]
++ low
ここで、sqList [low] = sqList [high]は正しい(sqList [low] = sqList [high] = 1)、エラーはこの++ lowにあり、++ lowの後、sqList [high]は変更されないか、最初の要素1ですが、sqList [low]は2番目の要素3を指すように変更されます。
プログラムが2番目のwhileステートメントブロックに入るとき、lowは2番目の位置を指しますが、highは最初の位置を指します。つまり、high <lowは、2番目のwhileステートメントブロックに入る条件を満たさないため、2番目のステートメントブロックを直接スキップします。 。プログラムは、2番目のwhileステートメントブロックの後も実行を続けます
sqList [high] = sqList [low];
- 高い;
sqList [high] = sqList [low]が実行されると、sqList [high] = sqList [low] = 3、sqListの値は3、3、2になります。実行を継続--high、highはsqListのインデックス範囲外です。この時点で、第2層の実行が完了し、プログラムは第1層に戻り、判定条件はlow <highです。分析すると、条件が確立されていないことは明らかであり、最初のレイヤーのwhileステートメントもロールアウトされます。プログラムは引き続き実行されます
sqList [low] = temp;
このとき、sqListは3、1、2になります。
次の2つのifステートメントでは、low = i +1とj = low + 1が条件を満たしていないため、直接スキップされ、アルゴリズム全体が実行され、並べ替えの結果は3、1になります。 2.2。
これは、変更されたコードでは発生しません。