データ構造の8つの一般的なソートアルゴリズム

データ構造の8つの一般的なソートアルゴリズム

[[172688]]

序文

8 つのソート アルゴリズムと 3 つの検索アルゴリズムは、データ構造における非常に基本的な知識ポイントです。ここでは、復習のために 8 つの一般的なソート アルゴリズムをまとめます。

8 つの一般的なソート アルゴリズムには、次の関係があります。

パフォーマンスの比較:

次に、Python を使用してそれぞれを実装します。

直接挿入ソート

アルゴリズムのアイデア:

直接挿入ソートの基本的な考え方は、配列内のすべての要素を、以前にソートされた要素と順番に比較することです。選択された要素がソートされた要素よりも小さい場合は、すべての要素が比較されるまで、その要素が交換されます。

したがって、上記の説明から、直接挿入ソートは 2 つのループで完了できることがわかります。

*** レイヤーループ: 比較するすべての配列要素を走査します

2 番目のループ: このラウンドで選択された要素 (selected) とソートされた要素 (ordered) を比較します。選択済み > 順序付きの場合、2つを入れ替える

コードの実装

シェルソート

アルゴリズムのアイデア:

ヒルソートのアルゴリズムの考え方は、ソートする配列をステップサイズのギャップに応じてグループ化し、各グループの要素を直接挿入ソート法を使用してソートし、ギャップを毎回半分に減らし、上記の操作を繰り返します。ギャップ= 1 の場合、直接挿入を使用してソートを完了します。

同様に、上記の説明から、シェル ソートの全体的な実装は 3 つのループで完了する必要があることがわかります。

*** レイヤー ループ: ギャップを順番に半分にし、ギャップ = 1 になるまでシーケンスをグループ化します。

2 番目と 3 番目のループは、直接挿入ソートに必要な 2 つのループです。詳細な説明については上記を参照してください。

コード実装:

単純な選択ソート

アルゴリズムのアイデア

単純選択ソートの基本的な考え方:比較 + 交換。

ソートするシーケンスから最小のキーワードを持つ要素を検索します。

最小の要素がソートするシーケンスの最初の要素でない場合は、最初の要素と交換します。

残りのN-1個の要素からキーワードが最も小さい要素を探し、ソートが完了するまで手順(1)と(2)を繰り返す。

したがって、単純な選択ソートも 2 層のループを通じて実装されていることがわかります。

*** レイヤーループ: シーケンス内の各要素を順番に走査します

2 番目のループ: トラバーサルによって取得された現在の要素を残りの要素と順番に比較し、最小要素の条件を満たす場合はそれらを交換します。

コードの実装

ヒープソート

ヒープの概念

ヒープ: 本質的には配列オブジェクトです。特に重要な特性: 任意のリーフ ノードは、そのすべての親ノードよりも小さい (または大きい) です。この点では、最大ヒープと最小ヒープに分けられます。最大ヒープでは、ノードの要素がその子よりも大きくなければならないことが要求され、最小ヒープでは、ノードの要素がその左と右の子よりも小さくなければならないことが要求されます。どちらも、左と右の子のサイズ関係については何も要求しません。

ヒープソートの使用は、最大ヒープまたは最小ヒープに基づくソート方法です。次に、最大ヒープを通じて実装します。

基本的な考え方:

ヒープソートは以下の手順で実行できます。

まず、シーケンス構造はビッグトップヒープと呼ばれます。

(これは最大ヒープの特性を満たします。ルートノードの要素は現在のシーケンスの最高値である必要があります)

現在の最大ヒープのルート ノードを取り出し、シーケンスの末尾の要素と交換します。

(この時点では、シーケンスの末尾の要素はソートされた最高値です。要素が入れ替わるため、現在ルート ノードにあるヒープは必ずしも最大ヒープのプロパティを満たすわけではありません)

交換後に n-1 個のシーケンス要素を最大ヒープのプロパティを満たすように調整します。

ヒープ内の要素が 1 つだけになるまで手順 2.3 を繰り返します。

コード実装:

バブルソート

基本的な考え方

バブルソートの考え方は比較的シンプルです。

シーケンスの左側の要素と右側の要素を順番に比較して、右側の要素が常に左側の要素よりも大きいことを確認します。

(最初のラウンドの後、シーケンスの最初の要素は現在のシーケンスの最初の値である必要があります。)

シーケンス内の残りの n-1 個の要素に対して手順 1 を繰り返します。

長さnのシーケンスの場合、合計n-1回の比較を実行する必要がある。

(whileループを使用すると実行回数を減らすことができます)

*コード実装

クイックソート

アルゴリズムのアイデア:

クイックソートの基本的な考え方:穴を掘って数字を埋める+分割統治法

シーケンスからピボットを選択

ここでは、シーケンス内の最大の数字をベンチマーク番号として選択します。

シーケンス内のすべての数字を順番にトラバースします。基本数より大きい数字は右側にあり、基本数より小さい数字は左側にあります。

すべてのサブセットに要素が 1 つだけ含まれるまで、手順 1.2 を繰り返します。

疑似コードは次のとおりです。

1.i = L; j = R; 基数を掘り出して最初のピットa[i]を形成します。

2.j – 後ろから前に向かって小さい数字を探し、見つけたらその数字を掘り出して前の穴a[i]に埋めます。

3. i++ は前方から後方に向かって、それより大きい数を探します。数を見つけると、それを掘り出して、前のピット a[j] に埋めます。

4. i==jになるまで手順2と3を繰り返し、基数をa[i]に代入します。

コード実装:

マージソート

アルゴリズムのアイデア:

マージソートは、マージ操作に基づいた効果的なソートアルゴリズムです。このアルゴリズムは、分割統治法の典型的な応用です。その基本的な操作は、既存のサブシーケンスをマージして完全に順序付けられたシーケンスを実現することです。つまり、最初に各サブシーケンスを順序付けし、次にサブシーケンスのセグメントを順序付けします。

マージソートは実際には次の 2 つのことを行います。

分解 - シーケンスを毎回半分に分割します

マージ - 分割されたシーケンスセグメントをペアで並べ替えてマージします

したがって、マージソートは実際には分割+マージの2つの操作である。

マージする方法は?

L[first…mid] は最初のセグメント、L[mid+1…last] は 2 番目のセグメントで、両端はすでに整列しています。ここで、両端を組み合わせて L[first…last] に到達し、整列させる必要があります。

まず、最初のセグメントと2番目のセグメントから順番に要素を取り出して比較し、小さい方の要素をtemp[]に割り当てます。

前の手順を繰り返します。特定のセグメントが割り当てられたら、別のセグメントの残りの要素をtemp[]に割り当てます。

このとき、temp[]内の要素をL[]にコピーし、得られたL[first...last]を順序付けます。

どのように分解しますか?

ここでは、再帰的な方法を使用して、ソートするシーケンスを最初に 2 つのグループ A と B に分割し、次にシーケンス A と B をソートするプロセスを繰り返します。

グループ化。グループ化後にグループ内の要素が 1 つだけになるまで、この時点でグループ内のすべての要素が整然としていると見なされ、グループ化は終了します。

コードの実装

基数ソート

アルゴリズムのアイデア

基数ソート: ソートは、シーケンス内の各要素の値に従って、ソートする N 個の要素に対して「割り当て」と「収集」を複数回実行することによって実現されます。

割り当て: L[i] 内の要素を取り出し、まずその単位桁の数字を決定し、次に同じシリアル番号を持つバケットに割り当てます。

収集: シーケンス内のすべての要素が対応するバケットに割り当てられると、バケット内の要素が収集され、ソートされる新しいシーケンスL[ ]が形成される。

新しく形成されたシーケンスL[]の10桁目、100桁目などの割り当てと収集をシーケンスの最初の桁が割り当てられるまで繰り返し、ソートを完了します。

上記の「基数ソート」の表示によれば、実装プロセス全体が明確にわかります。

コードの実装

追記

これを書いた後、時間の比較を実行しました。

データが10,000件ある場合:

データが100,000件ある場合:

実行結果から判断すると、ヒープソート、マージソート、基数ソートは本当に高速です。

クイックソートの反復深度が制限を超える問題については、非再帰的な方法でクイックソートを実装することを検討できます。

参考文献

データ構造の視覚化: visualgo

シェルソート入門: シェルソート

ヒープソート: 「アルゴリズム入門」第6章 ヒープソートの読書ノート

ブログガーデン: 静かなる虚空

<<:  推奨システムでよく使用される推奨アルゴリズム

>>:  データサイエンティストが最もよく使用するアルゴリズム10選

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

モジュール式の機械学習システムで十分でしょうか?ベンジオの教師と生徒が答えを教えてくれます

ディープラーニングの研究者は、神経科学と認知科学からインスピレーションを得ています。隠れユニットや入...

TextRankアルゴリズムを使用した自動テキスト要約

【51CTO.com クイック翻訳】1. はじめにテキスト要約は、自然言語処理 (NLP) の分野に...

可観測性はAIの成功の重要な要素の一つである

ますます多くの企業が自社のインフラストラクチャやビジネス プロセスに人工知能を統合するにつれて、シス...

2023 年までにデータセンターで注目される AI と ML の 10 大アプリケーション

人工知能 (AI) と機械学習 (ML) は、データセンター分野の重要なテクノロジーとなっています。...

あなたの孤独をAIが見抜く:その精度はなんと94%

[[344787]]あなたは本当に「孤独」ですか?かつて宇宙規模で流行したこの「国際孤独度スケール...

【ビッグコーヒーがやってくるエピソード5】ビッグデータミドルプラットフォームの構築方法

今回、「ビッグネームがやってくる」のライブ放送にゲストとして参加したのは、iResearch CTO...

公式論文コードが公開されました。OpenAIはGPT-3のイメージ版をどのように実装したのでしょうか?

OpenAIはDALL-Eに関するいくつかの論文と実装コードを公開しました。今年初め、OpenAI...

...

AI音声アシスタントと仮想IP画像の組み合わせは、ブランドマーケティングの新たな名刺になるかもしれない

最近、世界インターネット会議で「世界インターネット発展報告書2020」が発表されました。報告書では、...

テンセントAIが新たな記録を樹立:ACL 2020に27本の論文が選出

最近、計算言語学会(ACL)は公式ウェブサイトでACL 2020の採択論文リストを発表し、合計779...

...

人工知能の登場により、一人暮らしの高齢者の介護は難しくなくなり、高齢者介護はテクノロジーの時代に入った

[[389635]]私の国では高齢化が進み、高齢者介護は長い間、社会全体で広く関心を集めるテーマとな...

...

ドローンによる食品配達が到来、こうした問題が注目を集めている

無人運転車による配達に続き、ドローンによる食品配達も現実化に向かって加速している。先日終了した202...

エンジニアはETLを書くべきか? - 効率的なアルゴリズム/データサイエンス部門の構築方法を教えます

[[174647]]序文多くのインターネット企業のアルゴリズム関連部門(検索、レコメンデーション、広...