序文 読者は自分で試してみることができます。ソースコードはここ (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 つのソート アルゴリズムはすべてバケットの概念を使用しますが、バケットの使用方法には明らかな違いがあります。
|
<<: ディープニューラルネットワークの数学的基礎は難しすぎますか?
中国共産党中央委員会と国務院がこのほど発表した「知的財産強国建設要綱(2021~2035年)」では、...
古代から今日のモバイルインターネット時代に至るまで、人類の誕生以来、世界に影響を与えてきたあらゆる破...
WeChatミニプログラムにゲーム「Jump Jump」が登場して以来、多くのWeChatユーザーが...
この記事の主な対象読者は、機械学習の愛好家やデータサイエンスの初心者、そして機械学習アルゴリズムを学...
自然言語処理 (NLP) は、コンピューター サイエンスと人工知能の分野における重要な方向性です。自...
人工知能 (AI) と機械学習の台頭により、あらゆる業界に大きな変化が起きています。データ量が増加し...
企業の世界における人工知能の利点は何でしょうか?企業分野における AI の主な利点の 1 つは、プロ...
この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...
Google、Facebook、Amazon、Apple、Microsoftなどの大手アメリカのテク...
最近、清華大学初のAI学生がついにその本性を現した。伝えられるところによると、彼の名前は華志兵。清華...
組織が業務を効率化し、ビジネスイニシアチブをサポートするために、実行可能で信頼性が高く、俊敏な機械学...
どの学校も生徒をより深く理解したいと考えていますが、テクノロジーを駆使した解決策の中には、満場一致で...