クイックソートはバブルソートの改良版です。その基本的な考え方は、ソート パスを通じて、ソートするデータが 2 つの独立した部分に分割され、一方の部分のすべてのデータがもう一方の部分のすべてのデータよりも小さくなり、その後、この方法に従って 2 つの部分のデータが別々にすばやくソートされるというものです。ソート プロセス全体を再帰的に実行して、データ全体を順序付けられたシーケンスに変換できます。クイックソートは不安定で、O(log(n)) の追加スペースを必要とし、時間計算量は O(nlog(n)) であり、適応性がありません。 クイックソートには、言及する価値のあるバリエーションがいくつかあります。以下に簡単に紹介します。 ランダム化されたクイックソート:クイックソートの最悪のケースは、各パーティションのピボットの選択に基づきます。基本的なクイックソートでは、最初の要素がピボットとして選択されます。このように、配列がすでに順序付けられている場合、各分割は最悪の結果になります。一般的な最適化方法は、要素をメイン要素としてランダムに選択するランダム化アルゴリズムです。この場合、最悪のケースは依然として O(n^2) ですが、最悪のケースはもはや入力データに依存せず、ランダム関数の評価が不十分なために発生します。実際、クイックソートをランダム化して理論上の最悪のケースを得る確率は 1/(2^n) だけです。したがって、ランダム化クイックソートは、ほとんどの入力データに対して予想される時間計算量 O(nlogn) を達成できます。ある先輩が素晴らしい要約をしてくれました。「ランダムクイックソートは、人の性格のニーズを一生涯満たすことができます。」 ランダム化クイックソートの唯一の欠点は、入力データに同一データが大量に存在すると、ランダム化の効果が直接的に弱まってしまうことです。極端なケース、つまり n 個の同一の数字をソートする場合、ランダムクイックソートの時間計算量は間違いなく O(n^2) に削減されます。解決策は、ピボットを交換せずにそのままの状態でスキャンすることです。 バランス クイックソート: 毎回、中央値をキー データとして表すことができる要素を選択し、通常のクイックソートの原則に従って比較、置換、再帰を実行します。一般的に、このデータを選択する方法は、開始データ、終了データ、中間データを取得し、比較して中央値を選択することです。この3つの値を取る利点は、実際の問題(情報科学のコンテストなど)では、近似連続データや反転データが出現する可能性が高いことです。この場合、真ん中のデータが必然的に中央値になり、実は近似中央値でもあります。中央が大きく両側が小さい(またはその逆)データに遭遇し、取得した値が最大値に近い場合、少なくとも2つの部分を分離できるため、実際の効率は約2倍になり、データを少し乱して縮退構造を破壊することが有益です。 外部クイックソート: 通常のクイックソートとは異なり、キーデータはバッファです。まず、前と次の M/2 要素がバッファに読み込まれ、バッファ内のこれらの要素がソートされます。次に、ソートされた配列の先頭 (または末尾) から次の要素が読み込まれます。この要素がバッファ内の最小の要素よりも小さい場合は、最初の空きスペースに書き込まれます。この要素がバッファ内の最大の要素よりも大きい場合は、最後の空きスペースに書き込まれます。それ以外の場合は、バッファ内の最大または最小の要素が配列に書き込まれ、バッファに配置されます。すでに順序付けされた中間データの再配置を避けるため、最大値はこれらのキー データより低く、最小値はこれらのキー データより高く設定してください。完了後、配列の中央のスペースを空ける必要があり、バッファは配列の中央のスペースに書き込まれます。次に、小さい外側の部分を再帰的にソートし、他の部分を循環的にソートします。 3 方向基数クイックソート (マルチキー クイックソート、マルチキー クイックソートとも呼ばれます) : 基数ソート (一般的な文字列比較ソートは基数ソートであるなど) とクイックソートの特性を組み合わせたもので、文字列ソートに比較的効率的なアルゴリズムです。このアルゴリズムによってソートされる配列の要素には、文字列などのマルチキーという特性があり、各文字はキーとみなすことができます。アルゴリズムは、ソートされた配列内の要素をキー データとしてランダムに選択するたびに、まずこの要素の最初のキー (文字) のみを考慮し、次にキーを比較して、他の要素をキー データより小さい、等しい、大きい 3 つの部分に分割します。次に、このキーの位置に基づいて「より小さい」部分と「より大きい」部分を再帰的にソートし、次のキーに基づいて「等しい」部分をソートします。 コード実装:
クイックソートは現在最も広く使われているソートアルゴリズムです。クイックソートの核心はセグメンテーションアルゴリズムにあり、最も巧妙な部分とも言えます。この記事がお役に立てば幸いです。 【編集者のおすすめ】
|
<<: Java ソートアルゴリズムの概要 (VIII): 基数ソート
>>: Java ソートアルゴリズムの概要 (VI): ヒープソート
現在、ホテルやエンターテインメント業界のチェーンは、ゲストの体験やレビューをスキャンして理解するため...
[[250312]]手のひらをスワイプするだけで入場や支払いができ、道路清掃車にセンサーを追加するこ...
[[204469]]概要ガベージコレクションは、通常「GC」と呼ばれます。1960年にMITのLis...
誰かがGPT-3の独占に挑戦しなければなりません! GPT-3 は発売以来、最大の AI 言語モデル...
ビッグモデルが急増し、仮想世界から現実世界に進出しています。 Google DeepMind は最近...
熱帯雨林の杖が、ダンブルドアのようなあらゆる時代の並外れた魔法使いの伝説を生み出したのと同じように、...
マイクロソフトは8月16日、AI利用規約を発表し、9月30日に正式に発効すると発表した。新しい用語は...
大型モデルが人気となり、毎日さまざまな「ビッグ」ニュースを目にするようになりました。写真今日、もう一...
まず、ドローンはソレイマニの暗殺に使用され、その後、アルメニアとアゼルバイジャンの戦場でドローンが活...
周知のとおり、従来の手動メーター読み取り方法は時間がかかり、労働集約的であり、その正確性と適時性は保...
今年はAI技術の導入が話題になっています。 AIは本当に実装されているのでしょうか?真実を語るには実...
[[331060]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI...