序文 読者は自分で試してみることができます。ソースコードはここ (https://github.com/damonare/Sorts) で確認できます。ブロガーは github にライブラリを構築しており、読者はそれをクローンしてローカルで試すことができます。このブログ投稿はソースコードの経験があればもっと良くなる
JavaScript は他の追随を許さず、トップの座を獲得しました。
上位 10 位のソートアルゴリズム、または上位 10 位のソートアルゴリズムと同等の難易度のアルゴリズム ) ですが、これまで JavaScript を使用して実装したことがなく、関連するアルゴリズムの原理を注意深く研究したこともないため、記述に時間の無駄が生じてしまいます。そこで、自分で調べてブログにまとめることにしました。必要な時は自分のブログを見れば良いのです。諺にあるように、人に頼るより自分に頼る方が良いのです(ˉ(∞)ˉ)。
文章 ソートアルゴリズムの説明 (1)ソートの定義:キーワードに従ってオブジェクトのシーケンスをソートすること。 入力: n 個の数値: a1、a2、a3、...、an 出力: n 個の順列: a1'、a2'、a3'、...、an'、ただし a1' もっと具体的に言うと、背の高い人は後ろに立ち、背の低い人は前に立つように、列になって座り、座席を調整します。 (2)アルゴリズムのメリットを説明するために使われる用語の説明 安定: a が元々 b の前にあり、a=b の場合、ソート後も a は b の前にあります。 不安定: a が元々 b の前にあり、a=b の場合、ソート後に a が b の後に表示されることがあります。 内部ソート: すべてのソート操作はメモリ内で実行されます。 外部ソート: データが大きすぎるため、データはディスク上に配置され、ディスクとメモリ間のデータ転送を通じてソートが実行されます。 時間の複雑さ: アルゴリズムの実行にかかる時間。 空間計算量: プログラムを実行するために必要なメモリの量。 時間と空間の複雑さの詳細については、ここ (http://blog.csdn.net/booirror/article/details/7707551/) をクリックするか、Cheng Jie 著の「Data Structure in Chinese」という非常にわかりやすい本をお読みください。 (3)ソートアルゴリズムの図による概要(インターネットからの画像): ソート比較: 画像用語集: n: データサイズ k: 「バケット」の数 インプレース: 一定のメモリを占有し、追加のメモリを占有しない アウトプレース: 追加のメモリを占有します 分類カテゴリ: 1. バブルソート さて、最初のソートアルゴリズムであるバブルソートの概要を説明しましょう。 C言語を学んだ人なら誰でも理解できると思います。多くの人が最初に接するソートアルゴリズムかもしれません。 (1)アルゴリズムの説明 バブルソートは単純なソートアルゴリズムです。ソートする配列を繰り返し処理し、一度に 2 つの要素を比較して、順序が間違っている場合はそれらを交換します。シーケンスを訪問する作業は、交換が不要になるまで、つまりシーケンスがソートされるまで繰り返されます。このアルゴリズムの名前は、小さな要素が交換を通じてゆっくりとシーケンスの先頭に「浮かんで」いくという事実に由来しています。 (2)アルゴリズムの記述と実装 具体的なアルゴリズムは次のように説明されます。
JavaScript コードの実装:
改良されたバブルソート:各ソートの最後の交換の位置を記録するためにランドマーク変数 pos を設定します。 pos 位置以降のレコードは所定の位置にスワップされているため、次のソートでは pos 位置までスキャンするだけで十分です。 改善されたアルゴリズムは次のとおりです。
従来のバブルソートでは、各ソート操作で最大値または最小値しか見つけることができません。各ソート操作で順方向と逆方向の2ラウンドのバブル処理を実行し、一度に2つの最終値(最大値と最小値)を取得する方法を使用することを検討し、これによりソートパスの数をほぼ半分に削減します。 改善されたアルゴリズムは次のように実装されます。
3 つの方法の時間比較: 図からわかるように、改良されたバブルソートでは時間の複雑さが大幅に軽減され、処理時間が短縮されます。読者はここをクリックして自分で試してみることができます。ブロガーは GitHub にライブラリを構築しており、読者はそれをクローンしてローカルで試すことができます。このブログ投稿はソースコードの経験があればもっと良くなります~~~ バブルソートのアニメーションのデモンストレーション: (3)アルゴリズム分析
入力データがすでに正の順序になっている場合 (すでに正の順序になっているので、わざわざ並べ替える必要はありません...)
入力データが逆順の場合(順序を逆にすればいいのに…)
2. 選択ソート 最も安定したソート アルゴリズムの 1 つです (この安定性はアルゴリズム レベルの安定性を指すのではありません。2333 さんのおっしゃる意味を理解できるほど賢い方だと思います)。入力されるデータに関係なく、時間の計算量は O(n²) であるためです。したがって、このアルゴリズムを使用する場合は、データ サイズが小さいほど良いです。唯一の利点は、余分なメモリスペースを占有しないことです。理論的に言えば、選択ソートはおそらくほとんどの人が思い浮かべる最も一般的なソート方法です。 (1)アルゴリズムの紹介 選択ソートはシンプルで直感的なソートアルゴリズムです。仕組み: まず、ソートされていないシーケンス内の最小 (最大) の要素を見つけて、ソートされたシーケンスの先頭に格納します。次に、残りのソートされていない要素から最小 (最大) の要素を探し、ソートされたシーケンスの最後に配置します。すべての要素がソートされるまでこれを繰り返します。 (2)アルゴリズムの記述と実装 n レコードの直接選択ソートは、n-1 ラウンドの直接選択ソートによって実行され、順序付けられた結果が得られます。具体的なアルゴリズムは次のように説明されます。
Javascript コードの実装:
選択ソートのアニメーションのデモンストレーション: (3)アルゴリズム分析
3. 挿入ソート 挿入ソートのコード実装はバブルソートや選択ソートほど単純で粗雑ではありませんが、その原理は最も理解しやすいはずです。ポーカーをプレイしたことがある人なら誰でも数秒で理解できるはずです。もちろん、ポーカーをプレイしているときにカードをランク順に並べることはないと言うのであれば、この人生で挿入ソート アルゴリズムに興味を持つことは決してないと考えられます... (1)アルゴリズムの紹介 挿入ソートのアルゴリズムの説明は、シンプルで直感的なソート アルゴリズムです。これは、順序付けられたシーケンスを構築することによって機能します。ソートされていないデータの場合は、ソートされたシーケンス内で後ろから前へスキャンし、対応する位置を見つけて挿入します。挿入ソートは通常、インプレースソート(つまり、O(1)の追加スペースのみを必要とするソート)によって実装されます。したがって、後ろから前へスキャンするプロセスでは、挿入する最初の要素のためのスペースを確保するために、ソートされた要素を繰り返し後方に移動する必要があります。 (2)アルゴリズムの記述と実装 一般的に、挿入ソートは配列上でインプレースで実装されます。具体的なアルゴリズムは次のように説明されます。
Javascript コードの実装:
挿入ソートの改善:挿入位置を見つけるときにバイナリ検索を使用する
改善前と改善後の比較: 挿入ソートのアニメーションデモンストレーション: (3)アルゴリズム分析
4. シェルソート 1959年にシェル社によって発明されました。 O(n^2) を突破した最初のソートアルゴリズム。単純な挿入ソートの改良版です。挿入ソートとは異なり、より遠い要素の比較を優先します。シェルソートは縮小増分ソートとも呼ばれる (1)アルゴリズムの紹介 シェルソートの核心は、間隔シーケンスの設定にあります。間隔シーケンスは事前に設定することも、動的に定義することもできます。間隔シーケンスを動的に定義するアルゴリズムは、『アルゴリズム』(第 4 版)の共著者である Robert Sedgewick によって提案されました。 (2)アルゴリズムの記述と実装 まず、ソートするレコードシーケンス全体をいくつかのサブシーケンスに分割し、直接挿入してソートします。具体的なアルゴリズムの説明は次のとおりです。
Javascript コードの実装:
ヒルソーティング図(インターネットからの画像): (3)アルゴリズム分析
5. マージソート 選択ソートと同様に、マージソートのパフォーマンスは入力データの影響を受けませんが、時間の計算量が常に O(n log n) であるため、選択ソートよりもはるかに優れたパフォーマンスを発揮します。コストは、必要な追加のメモリスペースです。 (1)アルゴリズムの紹介 マージソートは、マージ操作に基づいた効果的なソートアルゴリズムです。このアルゴリズムは、分割統治法の非常に典型的な応用です。マージソートは安定したソート方法です。順序付けられたサブシーケンスをマージして、完全に順序付けられたシーケンスを取得します。つまり、最初に各サブシーケンスを順序付けし、次にサブシーケンスのセグメントを順序付けます。 2 つの順序付きリストが 1 つの順序付きリストに結合される場合は、2 方向の結合と呼ばれます。 (2)アルゴリズムの記述と実装 具体的なアルゴリズムは次のように説明されます。
JavaScript コードの実装:
マージソートのアニメーションデモンストレーション: (3)アルゴリズム分析
6. クイックソート クイック ソートという名前は単純で大雑把です。この名前を聞いた瞬間に、その存在の意味がわかります。つまり、高速で効率的です。これは、ビッグ データを処理するための最速のソート アルゴリズムの 1 つです。 (1)アルゴリズムの紹介 クイックソートの基本的な考え方は、ソートプロセスを通じて、ソートするレコードを 2 つの独立した部分に分けることです。レコードの 1 つの部分のキーワードが他の部分のキーワードよりも小さい場合、レコードの 2 つの部分を個別にソートして、シーケンス全体の順序を実現できます。 (2)アルゴリズムの記述と実装 クイックソートは、分割統治アルゴリズムを使用してリストを 2 つのサブリストに分割します。具体的なアルゴリズムは次のように説明されます。
クイックソートアニメーションのデモンストレーション: (3)アルゴリズム分析
7. ヒープソート ヒープソートは、ヒープの概念を使用してソートする選択ソートであると言えます。 (1)アルゴリズムの紹介 ヒープソートとは、ヒープ データ構造を使用して設計されたソート アルゴリズムを指します。スタックは、完全な二分木を近似し、スタックの特性を満たす構造です。つまり、子ノードのキー値またはインデックスは常に親ノードよりも小さい (または大きい) です。 (2)アルゴリズムの記述と実装 具体的なアルゴリズムは次のように説明されます。
Javascript コードの実装: ヒープソートのアニメーションのデモンストレーション: (3)アルゴリズム分析
8. カウントソート カウンティングソートの中核は、入力データの値をキーに変換し、それを追加の配列スペースに格納することです。 線形時間計算量を持つソート方法として、カウンティングソートでは、入力データが特定の範囲の整数である必要があります。 (1)アルゴリズムの紹介 カウンティングソートは安定したソートアルゴリズムです。カウントソートでは追加の配列 C が使用されます。ここで、i 番目の要素は、ソートする配列 A 内で値が i に等しい要素の数です。次に、配列 C を使用して、配列 A 内の要素を正しい位置に配置します。整数のみをソートできます。 (2)アルゴリズムの記述と実装 具体的なアルゴリズムは次のように説明されます。
Javascript コードの実装: JavaScript アニメーション画像デモ: (3)アルゴリズム分析 入力要素が 0 から k までの n 個の整数の場合、実行時間は O(n + k) です。カウンティングソートは比較ソートではなく、そのソート速度はどの比較ソートアルゴリズムよりも高速です。カウント配列 C の長さは、ソートする配列内のデータの範囲 (ソートする配列の最高値と最低値の差に 1 を加えた値) に依存するため、データ範囲が大きい配列の場合、カウント ソートには多くの時間とメモリが必要になります。
9. バケットソート バケットソートは、カウントソートのアップグレード版です。これは関数のマッピング関係を利用しますが、その効率の鍵はこのマッピング関数の決定にあります。 (1)アルゴリズムの紹介 バケット ソートは、入力データが均一に分散されていると想定し、データを有限数のバケットに分割し、各バケットを個別にソートすることによって機能します (別のソート アルゴリズムを使用するか、バケット ソートを再帰的に使用し続ける可能性があります)。 (2)アルゴリズムの記述と実装 具体的なアルゴリズムは次のように説明されます。
Javascript コードの実装: バケット分類図(インターネットからの画像): (3)アルゴリズム分析 バケット ソートでは、最良の場合でも線形時間 O(n) が使用されます。バケット ソートの時間計算量は、各バケット間のデータのソートの時間計算量に依存します。これは、他の部分の時間計算量が O(n) であるためです。当然ですが、バケットが小さいほど、バケット間のデータが少なくなり、ソートにかかる時間も短くなります。ただし、それに応じてスペースの消費量も増加します。
10. 基数ソート 基数ソートも非比較ソート アルゴリズムであり、最初のビットから始めて各ビットを O(kn) の複雑度でソートします。ここで、k は配列の長さ、k は配列の最初の桁数です。 (1)アルゴリズムの紹介 基数ソートでは、まず下位の順序でソートし、次に集計し、次に上位の順序でソートし、最後に集計し、というように最後の順序までソートします。一部の属性には優先順位があり、最初に低い優先順位で並べ替え、次に高い優先順位で並べ替える場合があります。 *** の順序は、優先度の高いものが先に表示され、優先度が同じ場合は優先度の低いものが先に表示されます。基数ソートは、個別のソートと個別のコレクションに基づいているため、安定しています。 (2)アルゴリズムの記述と実装 具体的なアルゴリズムは次のように説明されます。
Javascript コードの実装: 基数ソート LSD 動的ダイアグラムのデモンストレーション: (3)アルゴリズム分析
基数ソートには 2 つの方法があります。
基数ソート vs カウンティングソート vs バケットソート これら 3 つのソート アルゴリズムはすべてバケットの概念を使用しますが、バケットの使用方法には明らかな違いがあります。
|
<<: ディープニューラルネットワークの数学的基礎は難しすぎますか?
機械学習 (ML) とディープラーニング (DL) の技術を包括する用語である人工知能 (AI) は...
[[428042]]今後予測できることは、人工知能の時代が徐々に深まり、私たちの生活がSF映画のリ...
ご存知のとおり、コンピューティング パワーの文字通りの意味はコンピューティング能力です。 「コンピュ...
近年、社会経済の発展に伴い、人工知能技術は科学技術の最前線に立っています。テクノロジーが成熟するにつ...
情報検索 (IR) は、インターネットの誕生以来、揺るぎない地位を築いてきました。膨大なデータからユ...
01ロボティックプロセスオートメーション(RPA) RPA (ロボティック プロセス オートメーショ...
ファーウェイは6月25日、成都で開催された2022 Ascend AI開発者イノベーションデーで、人...
現在、カリフォルニア大学リバーサイド校が率いるチームは、ジョージ・メイソン大学およびノートルダム...
2018年のダブルイレブンは、「富豪」に対する私の認識を新たにしました。その前に、アリババの張勇は...
テクノロジーは常に世界を変えています。人工知能とビッグデータが融合し、人々にさまざまな恩恵をもたらし...
この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...
音声認識市場2021の詳細な市場レポートはこちら音声認識はあらゆるものの未来です。私たちは、身の回り...