データ構造の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選

ブログ    
ブログ    

推薦する

完全な自動運転まであとどれくらいでしょうか?答えはセンサー技術の発展にある

近年、新エネルギー車が次々と登場し、販売も増加し続けています。テスラ、ウェイラン、小鵬汽車などの新エ...

機械知能のための TensorFlow 実践: 製品環境へのモデルの導入

TesnsorFlow を使用して、基本的な機械学習モデルから複雑なディープラーニング ネットワーク...

ドローン盗撮の防止は難しく、3つの面での取り組みが必須

近年、民間ドローンの急速な普及は、空中撮影、レジャーや娯楽、農作物の保護、電力検査など、人々の生産と...

推理力が2倍にアップ!プリンストン大学と北京大学の卒業生がロング「メデューサ」を提供、33Bモデルは13Bと同等の速さ

LLM アーキテクチャに固有のメモリ制限により、生成は遅く、コストがかかります。この点に関して、多く...

この記事では、ニューラルネットワークBPアルゴリズムの原理とPythonでの実装について説明します。

私は最近、BP アルゴリズムを体系的に研究し、この研究ノートを書きました。私の能力が限られているため...

ピリパインテリジェントファイナンス&タックス2018エンタープライズサービス+ウィズダムフォーラムが成功裏に終了

ピリパ・インテリジェンス・アンド・タックスが主催する2018年企業サービス+ウィズダムフォーラムが、...

人工知能技術が伝染病の予防と制御に役立つ

[[318426]]現在、人工知能技術は急速に発展しており、特に医療保健の分野では、生活の各分野で広...

21 人の専門家が語る: 2017 年の人工知能の展望

2016年はボットにとって歴史的な年でした。Facebookなどの主要プラットフォームがMessen...

...

現代のサイバーセキュリティに人工知能が必要な理由

ダイヤルアップ インターネットの時代よりずっと以前、ウイルスが感染したフロッピー ディスクを介して拡...

再トレーニングなしでモデルを6倍圧縮:数学者チームが新しい量子化法を提案

RUDN大学の数学者チームは、再トレーニングに余分なリソースを費やすことなく、ニューラルネットワーク...

Python で KNN アルゴリズムを使用して欠損データを処理する

欠損データの処理は簡単な作業ではありません。 方法は、単純な平均補完や観察結果の完全な削除から、MI...

今年のノーベル賞はアルトゥール・エケルト氏が受賞すると見られている。百度研究所の科学者の力を過小評価すべきではない。

2019年のノーベル賞受賞者のリストは、今年10月7日から発表されます。発表日が近づくにつれ、学界...

ChatGPT を成功させるための 26 のスーパーヒント

今日は、実際の戦闘でよく使われる26のヒントを紹介します。これにより、出力がより効果的になります。見...

次世代AIの導入が急増する中、新たな研究がデータの信頼性の問題を警告

信頼できる人工知能(AI)データ企業であるClouderaの新しい調査によると、米国の組織の半数以上...