概要
クイックソートは、トニーホールによって開発されたソートアルゴリズムです。平均的な状況では、nアイテムの順序では、対および比較が必要です。実際、クイックソートは通常、他のο(nlogn)アルゴリズムよりも大幅に高速です。これは、ほとんどのアーキテクチャでその内側ループを効率的に実装できるため、ほとんどの実際のデータでは、設計の選択を決定し、時間を必要とする二次用語の可能性を減らすことができます。
クイックソート、レコードを1つの注文から2つの独立した部分に分割します。ここでは、一部のレコードのキーワードは他の部分のキーワードよりも小さくなり、2つのレコードを個別にソートして、シーケンス全体を順序付ける目的を達成します。
画像イラスト:
ステップ
ベンチマーク要素を選択するとき、最初の要素または最後の要素は通常、1つの整形を介して2つの独立した部分に分類するレコードを分割するために選択されます。ここでは、一部のレコードの要素値がベンチマーク要素値よりも小さくなります。他の部分に記録された要素は、基準値よりも大きいです。この時点で、参照要素はソートされた後に正しい位置にあり、その後、レコードの2つの部分は、シーケンス全体が順序付けられるまで同じ方法でソートされ続けます。
例
生データ:
3 5 2 6 2
ベンチマークとして3を選択します
最初のラウンド
右から左へ3、2の一致よりも小さいものを見つけ、2と3 2 5 2 6 3を1回調整し、検索の方向が左から右に逆になり、3、5の一致よりも大きいものを見つけ、右から左に調整して3、2より小さいものを見つけ、2 2 3 6 5 1ラウンドを調整します。
ラウンド2
[2 2]および2 2 3 6 5に対して上記と同じ方法が実行されます
第3ラウンド
[6 5]および2 2 3 5 6に対して上記と同じ方法が実行されます
最終結果
2 2 3 5 6
コード実装(Java)
パッケージcom.coder4j.main.arithmetic.sorting; public class Quick {private static int mark = 0; / ** * Auxiliary Exchange Method * * @param array * @param a * @param b */ private static void swap(int] array、int a、int b){if(a!= b){int temp = array [a]; array [a] = array [b];配列[b] = temp; //一致する、Switch System.out.println( "Shift" + array [a] + "および" + array [b] + "、get"); for(int i:array){system.out.print(i + ""); } system.out.println(); }} / ** *新しいラウンドの分離 * * @param array * @param low * @return * / private static int pertition(int array []、int low、int high){int base = array [low];マーク++; System.out.println( "Throwth in Progress" + Mark + "ホイール分離、領域:" + low + " - " + high); while(low <high){while(low <high && array [high]> = base){high--; System.out.println( "比率を見つけるための右から左へ" + base + "小さい、ポインターの変更:" + low + " - " + high); } swap(array、low、high); while(low <high && array [low] <= base){low ++; System.out.println( "比率を見つけるための左から右へ" + base + "大型、ポインターの変更:" + low + " - " + high); } swap(array、low、high); } lote low; } / ** *アレイのクイックソート、再帰的 * * * @param array * @param low * @param height * @return * / private static int [] Quicksort(int [] array、int low、int height){if(low <height){if(int division = partition(array、low、height); QuickSort(アレイ、ロー、ディビジョン-1); QuickSort(アレイ、ディビジョン + 1、高さ); } return array; } / ** *クイックソート * * @param array * @return * / public static int [] sort(int [] array){return quicksort(array、0、array.length -1); } public static void main(string [] args){int [] array = {3、5、2、6、2}; int [] sorted = sort(array); System.out.println( "最終結果"); for(int i:sorted){system.out.print(i + ""); }}}テスト出力の結果:
すべてを選択して、メモに入れます。分離の最初のラウンドが実行されています。エリア:0-4。調整の第2ラウンドは2と3です。分離の第2ラウンドは2 5 2 6 3です。分離の第2ラウンドは3と5です。第2ラウンドの第2ラウンドは2 3 2 6 5です。分離の第2ラウンドは2と3です。分離の第2ラウンドは2と3です。分離は2と3です。分離の第2ラウンドは2と3です。分離の第2ラウンドは2および3です。分離の第2ラウンドは2と2です。分離の第3ラウンドは2です。2は2です。分離の第2ラウンドは2です。 5.分離の最後のラウンドは2です2は2、3は5です。最後の結果は2です。2は2、3は5。6です。最後の結果は2 2 35。6です。
テスト後、例の結果と一致します。