[データ構造] 10 種類の古典的なソート アルゴリズムの概要と分析

ここに画像の説明を挿入します

序文

ソートアルゴリズムは、「データ構造とアルゴリズム」の最も基本的なアルゴリズムの 1 つです。

並べ替えアルゴリズムは内部並べ替えと外部並べ替えに分類できます。内部並べ替えはメモリ内のデータ レコードを並べ替えるのに対し、外部並べ替えは並べ替えられたデータが非常に大きく、並べ替えプロセス中に一度にすべての並べ替えレコードを収容できないためです。メモリにアクセスする必要があります。

ここに画像の説明を挿入します

これまでの 11 個の記事を学習することで、10 個の古典的な並べ替えアルゴリズムについて深く理解できました。この記事では、これら 10 個の古典的なアルゴリズムを要約し、比較し、分析します。

1. 上位 10 個の古典的な並べ替えアルゴリズムの分類

10 の一般的な並べ替えアルゴリズムは、次の 2 つの大きなカテゴリに分類できます

非線形時間比較ソート: 時間計算量がO (nlogn) O(nlogn)を超えることができないため、比較を通じて要素間の相対的な順序を決定します。O ( n l o g n )なので、非線形時間比較ソートと呼ばれます。

線形時間非比較ソート: 比較によって要素間の相対的な順序が決定されないため、比較ベースのソートの時間の下限を突破して線形時間で実行できるため、線形時間非比較ソートと呼ばれます。 。

ここに画像の説明を挿入します

2. 関連概念

  • 安定: a が元々 b の前にあり、a=b の場合、ソート後も a は b の前にあります。
  • 不安定: a が元々 b の前にあり、a=b の場合、ソート後に a が b の後に現れる可能性があります。
  • 内部ソート: すべてのソート操作はメモリ内で完了します。
  • 外部ソート: データが大きすぎるため、データはディスク上に配置され、ディスクとメモリ間のデータ転送を通じてのみソートを実行できます。
  • **時間計算量: **時間計算量とは、時間計算量の計算ではプログラムの特定の実行時間を計算するのではなく、アルゴリズムがステートメントを実行する回数を計算することを意味します。
  • スペースの複雑さ: スペースの複雑さは、アルゴリズムが動作中に一時的に占有するストレージ スペースの量の尺度です。

3. 古典的なアルゴリズムのトップ 10 の概要

ここに画像の説明を挿入します

ここに画像の説明を挿入します

用語集:

  • n: データサイズ
  • k: 「バケット」の数
  • インプレース: 定数メモリを占有し、追加のメモリを占有しません。
  • アウトプレイス: 余分なメモリを消費します

4. 補足内容

4.1 比較ソートと非比較ソートの違い

  • 一般的なクイックソート、マージソート、ヒープソート、バブルソートなどが比較ソートに属します並べ替えの最終結果では、要素間の順序は要素間の比較によって決まります。各数値を他の数値と比較して、その位置を決定する必要があります。バブルソート
    などのソートでは、問題のサイズはnであり、n回の比較が必要となるため、平均時間計算量はO(n2)O(n^2)となります。2 )マージソートやクイックソートなどのソートでは分割統治法ログオンログまで削減しますl o g nなので、平均時間計算量はO ( nlogn ) O(nlogn)O ( nログn )

    比較ソートの利点は、あらゆるサイズのデータ​​に適しており、データの分布に関係なくソートできることです。比較ソートは、ソートが必要なあらゆる状況に適していると言えます。

  • カウンティング ソート、基数ソート、バケット ソートは非比較ソートです。非比較並べ替えでは、各要素の前に要素の数を決定することによって並べ替えます。配列 arr について、arr[i] の前に要素がいくつあるかを計算すると、ソートされた配列内の arr[i] の位置が一意に決まります。
    非比較ソートでは、各要素の前に存在する要素の数を決定するだけでよく、すべてを 1 回の走査で解決できます。アルゴリズムの時間計算量O ( n ) O(n)

    非比較ソートは時間計算量が最も低くなりますが、一意の位置を決定するためにスペースを消費します。したがって、データの規模とデータの分散には一定の要件があります。

4.2 安定したアルゴリズムは本当に安定しているのでしょうか?

アルゴリズムのアイデア自体はプログラミング言語から独立しているため、アルゴリズムを実装するコードを作成する場合、多くの詳細を別の方法で処理できます。不安定なアルゴリズムの使用 特定の実装中にコードをどのように記述しても、同じ要素の最終位置は常に不確実です (変更されない場合もあれば、変更される場合もあります)。

安定した並べ替えアルゴリズムは、特定の実装中に詳細を適切に処理すれば安定しますが、一部の詳細が処理されない場合に得られる結果は依然として不安定です。

4.3 安定性の意味

単純な数値並べ替えだけを扱っている場合、安定性は実際にはあまり意味がありません。たとえば、1 2 3 3 4 のシーケンスで、sort メソッドを繰り返し実行した後、最初の 3 と後の 3 の位置が繰り返し変化する場合、sort メソッドを呼び出してソート結果を取得する上流アプリケーションでは、結果は 1 2 3 3 4 のままですが、3 の順序は関係ありません。

ソートされたコンテンツが複雑なオブジェクトの特定の数値属性のみである場合、安定性は依然として意味がありません (いわゆる交換操作のコストはアルゴリズムのコストにすでに含まれています。このコストが気に入らない場合は、安定性を向上させた方がよいでしょう)変換アルゴリズムを使用するには?)

ソートされたコンテンツが複雑なオブジェクトの複数の数値プロパティであっても、元の順序が無意味である場合、安定性は依然として無意味になります。

では、ソートアルゴリズムの「安定性」はどのような状況で意味を持つのでしょうか?

たとえば、クラス内の生徒が学生 ID に従って並べ替えられているとします。年齢が同じ場合は、学生 ID の昇順で並べ替える必要があります。ここで質問になりますが、選択した年齢の並べ替え方法が不安定な場合、並べ替え後に同じ年齢の生徒のグループの生徒数がおかしくなりますか? この同じ年齢の生徒のグループを再度並べ替える必要があります。学生番号に。安定した並べ替えアルゴリズムであれば、年齢で並べ替えるだけで済みます。

(あるキーからソートし、次に別のキーからソートすると、最初のキー ソートの結果は 2 番目のキー ソートに使用できます。ソートされる内容は複合オブジェクトの複数の数値属性であり、その元の順序はつまり、二次ソートに基づいて元のソートの意味を維持する必要があり、その後、安定したアルゴリズムを使用する必要があります)。

並べ替えアルゴリズムの「安定性」とは何を意味しますか?これは依然としてアプリケーションのシナリオに依存しますが、多くのユースケースでは実際の意味はありませんが、場合によっては非常に重要な意味を持ちます。

今では何の変哲もないアルゴリズムがたくさんありますが、ビッグ データ クラウド コンピューティングの条件下に置かれた場合、その安定性は非常に重要です。たとえば、タオバオで商品を販売量、価格、その他の条件に基づいて並べ替える場合、そのデータ サーバーには大量のデータが存在するため、ヒープ ソートやシェル ソートなどの安定性の悪い並べ替えアルゴリズムが使用されていました。最悪のシナリオでは、並べ替えの効果が非常に低くなり、サーバーのパフォーマンスに深刻な影響を及ぼし、ユーザー エクスペリエンスに影響を与えます。

4.4 時間計算量の補足

一般に議論される時間計算量は、最悪の場合の時間計算量です。その理由は、最悪の場合の時間計算量は、アルゴリズムが入力インスタンス上で実行される時間の上限であり、アルゴリズムが他のインスタンスより長く実行されないことを保証するためです。
平均時間計算量とは、考えられるすべての入力インスタンスが等しい確率で発生する場合に予想されるアルゴリズムの実行時間を指します。それぞれの状況の確率をpi piとするp i、平均時間計算量はsum (pi ∗ f (n)) sum(pi*f(n))s u m ( p if ( n ))

4.5 空間の複雑さの補足

プログラムのスペースの複雑さを使用して、プログラムの実行に必要なメモリを事前に見積もることができます。プログラム実行時に必要な記憶領域には、次の 2 つの部分があります。
(1) 固定部分: この部分の領域のサイズは、入出力データの数や値とは関係がありません。これには主に、命令スペース (つまり、コードスペース)、データスペース (定数、単純な変数) などが占めるスペースが含まれます。この部分は静的空間です。
(2) 可変スペース: この部分のスペースには、主に動的に割り当てられるスペースと再帰スタックに必要なスペースが含まれます。空間のこの部分のサイズはアルゴリズムに関連します。

空間計算量は、変数空間部分を考慮します

結論

本日のシェアはここまでです!記事が良いと思われる場合は、3 回サポートしていただけます。

今後私を見つけられないように注意することもできます。

Crossoads のホームページには興味深い記事がたくさんあります。お友達のコメントを歓迎します。あなたのサポートが著者の前進の原動力です。

並べ替えアルゴリズムの予備的な理解を説明します: https://blog.csdn.net/2301_80191662/article/details/142211265
直接挿入並べ替え: https://blog.csdn.net/2301_80191662/article/details/142300973
ヒルソート: https://blog.csdn.net/2301_80191662/article/details/142302553
直接選択ソート: https://blog.csdn.net/2301_80191662/article/details/142312028
ヒープソート: https://blog. csdn.net/ 2301_80191662/article/details/142312338
バブルソート: https://blog.csdn.net/2301_80191662/article/details/142324131
クイックソート: https://blog.csdn.net/2301_80191662/article/details/ 142324307
マージ並べ替え: https://blog.csdn.net/2301_80191662/article/details/142350640
カウント並べ替え: https://blog.csdn.net/2301_80191662/article/details/142350741
バケット並べ替え: https://blog. csdn.net /2301_80191662/article/details/142375338
基数並べ替え: https://blog.csdn.net/2301_80191662/article/details/142375592
上位 10 の古典的な並べ替えアルゴリズムの概要と分析: https://blog.csdn。ネット/2301_80191662/記事/詳細/142211564

ここに画像の説明を挿入します
参考内容:ソートアルゴリズムの「安定性」とは何でしょうか?どう答えますか? (qq.com)

トップ 10 の古典的な並べ替えアルゴリズムの複雑さの分析_Time 並べ替えアルゴリズムの複雑さ - CSDN ブログ

おすすめ

転載: blog.csdn.net/2301_80191662/article/details/142211564