1.コンセプト
クイック ソートは比較的効率的なソート アルゴリズムです。「分割統治」の考え方を採用し、複数の比較と交換を通じてソートを実現します。1 回のソート パスで、ソート対象のデータは 2 つの独立した部分に分割され、並べ替えにより、一方の部分のすべてのデータがもう一方の部分よりも小さくなり、その後 2 つの部分が再帰的に並べ替えられ続け、最終的にすべてのデータが順序どおりになります。
2. アイデア
① ソート対象の一連のシーケンスが与えられると、シーケンスの最初の要素を基本値として取得します。ベースライン値とは何ですか? あくまで参考のようなものです。次に、さらに 2 人のセンチネルを連れて行きます。センチネルとは何ですか? これをポインタとして考えてみましょう。
②それでは、この並び順はどうなるのでしょうか?まず、シーケンスの左端と右端に歩哨を配置し、それぞれを左と右と呼びます。左は左から右に移動して基本値より大きい数値を検索し、右は右から左に移動して基本値より小さい数値を検索します;
③最初の一歩は右から先にとることが定められています。、左端まで行かせますが、どこまで行くでしょうか?基本値より小さい数値が見つかるまで停止します。右が止まったら、左が進みます。同様に、左も基準値より大きい数値を見つけたら止まります。左右両方とも止まります。次に、この 2 つの位置の値を交換します。 、相互旅行の最初のラウンドが終了します。
④ 最初のラウンドが終わると、次のラウンドがあり、二人は途中で立ち止まり、会うこともなく、長い旅を続けます。同様に、left continue++ で右に進み、right- - で左に進み、条件が満たされたら双方が停止するのを待って値を交換し、交換後も歩き続けます。
⑤上記の突入処理はすべてwhileループで実装されています。で、外側の while ループは、両者が値を交換した後も実行を継続するように制御し、終了条件は左右が衝突した瞬間です。内側の 2 つの while ループは、ある停止点から別の停止点までのそれぞれの歩行プロセスを制御します。終了条件は、次の停止点が見つかったときです。。これは外側のループが歩き始めの命令を出したのと同じなので、内側のループはその命令を聞いて左右それぞれが次の停止位置に移動し、値を交換した後、外側のループからの命令を待って戻ります。次の目標点。
⑥ left == right になったらループを終了します 左右が基準値と一致する値を交換します このとき全体的に基準値の左側の数字が右側の数字より小さくなります参考値ですが、左右の値が順番がめちゃくちゃです;
⑦ 原理は同じですが、このときシーケンスをベースから 2 つの部分に分割することができます。これら 2 つの部分を再帰的に並べ替えて、最終的にすべてのデータを順番に取得します。。
3. コードの実装
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = {
3, 2, 9, 11, 17, 4, 13, 7, 5, 1, 12};
int[] newArr = quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(newArr));
}
public static int[] quickSort(int[] arr, int low, int high) {
if (low > high) {
return arr;
}
int base = arr[low];
int left = low;
int right = high;
while (left != right) {
while (arr[right] >= base && left < right) {
right--;
}
while (arr[left] <= base && left < right) {
left++;
}
int temp;
temp = arr[right];
arr[right] = arr[left];
arr[left] = temp;
}
arr[low] = arr[left];
arr[left] = base;
quickSort(arr, low, left - 1);
quickSort(arr, right + 1, high);
return arr;
}
}