クイックソートアルゴリズム。

シーケンステーブルについて説明した後、そのアプリケーションであるクイックソートアルゴリズムを見てみましょう。

データのアルゴリズムは次のとおりです。

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。

 

これは、変更されたコードでは発生しません。

おすすめ

転載: blog.csdn.net/tianyueWindbg/article/details/5858744