データ構造とアルゴリズムを学習していたとき、ソートアルゴリズムをアニメーションで表現して、理解しやすく覚えやすくしてみました。この記事は、[Demo Learning Data Structures and Algorithms in Object-C - Sorting Algorithm](https://github.com/MisterBooo/Play-With-Sort-OC)と合わせて読むと良いでしょう。 目次 * 選択ソート * バブルソート * 挿入ソート * クイックソート * 双方向クイックソート * 3ウェイクイックソート * ヒープソート * まとめと収穫 * 参考文献と参考文献 選択ソート 選択ソートは、シンプルで直感的なソートアルゴリズムです。どのようなデータが入力されても、時間の計算量は O(n?) です。したがって、使用する場合、データサイズが小さいほど良いです。唯一の利点は、余分なメモリスペースを占有しないことです。 1. アルゴリズムの手順 1. まず、ソートされていないシーケンス内の最小(最大)の要素を見つけ、それをソートされたシーケンスの先頭に格納します。 2. 残りのソートされていない要素から最小 (最大) の要素を探し続け、それをソートされたシーケンスの最後に配置します。 3. すべての要素がソートされるまで手順 2 を繰り返します。 2. コードの実装
バブルソート バブルソートもシンプルで直感的なソートアルゴリズムです。ソートする配列を繰り返し処理し、一度に 2 つの要素を比較して、順序が間違っている場合はそれらを交換します。シーケンスを訪問する作業は、交換が不要になるまで、つまりシーケンスがソートされるまで繰り返されます。このアルゴリズムの名前は、小さな要素が交換を通じてゆっくりとシーケンスの先頭に「浮かんで」いくという事実に由来しています。 1. アルゴリズムの手順 1. 隣接する要素を比較します。最初の値が 2 番目の値より大きい場合は、それらを交換します。 2. 先頭の最初のペアから最後のペアまで、隣接する要素の各ペアに対して同じ操作を実行します。このステップが完了すると、*** 要素は *** 数値になります。 3. 最後の要素を除くすべての要素に対して上記の手順を繰り返します。 4. 比較する必要のある数値のペアがなくなるまで、要素の数を減らしながら上記の手順を繰り返します。 2. コードの実装
挿入ソート 挿入ソートのコード実装はバブルソートや選択ソートほど単純で粗雑ではありませんが、その原理は最も理解しやすいはずです。ポーカーをプレイしたことがある人なら誰でも数秒で理解できるはずです。挿入ソートは、最も単純で直感的なソート アルゴリズムです。順序付けられたシーケンスを構築することで機能します。ソートされていないデータの場合は、ソートされたシーケンスの後ろから前へスキャンし、対応する位置を見つけて挿入します。 1. アルゴリズムの手順 1. ソートするシーケンスの最初の要素を順序付きシーケンスとして扱い、最初の要素の 2 番目の要素をソートされていないシーケンスとして扱います。 2. ソートされていないシーケンスを最初から最後までスキャンし、スキャンした各要素を順序付けられたシーケンスの適切な位置に挿入します。 (挿入する要素が順序付けられたシーケンス内の要素と等しい場合、挿入する要素は等しい要素の後に挿入されます。) 2. コードの実装
マージソート マージソートは、マージ操作に基づいた効果的なソートアルゴリズムです。このアルゴリズムは、分割統治法の非常に典型的な応用です。 分割統治の考え方の典型的なアルゴリズムの応用として、マージソートは次の 2 つの方法で実装されます。 >1. トップダウン再帰(すべての再帰メソッドは反復を使用して書き換えることができるため、2番目のメソッドがあります) >2. ボトムアップの反復 この記事では**トップダウン**マージソートを使用しています 1. アルゴリズムの手順 1. ソートされた 2 つのシーケンスの合計に等しいサイズのスペースを申請します。このスペースは、結合されたシーケンスを格納するために使用されます。 2. 2 つのソートされたシーケンスの開始位置を初期位置とする 2 つのポインタを設定します。 3. 2 つのポインタが指す要素を比較し、比較的小さい要素を選択してマージ スペースに配置し、ポインタを次の位置に移動します。 4. ポインタがシーケンスの末尾に到達するまで手順 3 を繰り返します。 5. 他のシーケンスの残りの要素をすべて、結合されたシーケンスの末尾に直接コピーします。 2. コードの実装
クイックソート クイックソートは、Tony Hall によって開発されたソートアルゴリズムです。平均すると、n 個の項目をソートするには O(nlogn) 回の比較が必要です。最悪の場合、O(n2) 回の比較が必要になりますが、これはまれです。実際、クイックソートは、その内部ループがほとんどのアーキテクチャで効率的に実装できるため、他の O(nlogn) アルゴリズムよりも大幅に高速になることがよくあります。 クイックソートでは、分割統治戦略を使用してリストを 2 つのサブリストに分割します。 クイックソートは、ソートアルゴリズムにおける分割統治の考え方のもう 1 つの典型的な応用です。本質的に、クイックソートはバブルソートに基づく再帰的な分割統治法とみなされるべきです。 クイック ソートという名前は単純で大雑把です。この名前を聞くと、その存在目的が高速かつ効率的であることがすぐにわかるからです。これは、大規模データに対する最も高速なソート アルゴリズムの 1 つです。 1. アルゴリズムの手順 1. シーケンスから「ピボット」と呼ばれる要素を選択します。 2. 基本値より小さいすべての要素が基本値の前に配置され、基本値より大きいすべての要素が基本値の後に配置されるようにシーケンスを並べ替えます (同じ数字をどちらの側にも配置できます)。このパーティションを抜けると、ベンチマークはシリーズの途中になります。これはパーティション操作と呼ばれます。 3. 基本値より小さい要素の部分列と基本値より大きい要素の部分列を再帰的にソートします。 クイックソートの最適化では、パーティション間隔が小さい場合に挿入ソートを使用することが考えられます。 2. コードの実装
マルチウェイクイックソート 重複キーが多すぎると、クイックソートは O(n^2) に減少します。 ダブルクイックソートを使用すると、クイックソートアルゴリズムは多数の要素を含む配列を簡単に処理できるようになります。 クイックソートの最適化では、パーティション間隔が小さい場合に挿入ソートを使用することが考えられます。 1. アルゴリズム図 2. コードの実装
3ウェイクイックソート 大量の繰り返しデータを含む配列の場合、3方向クイックソートは大きな利点がある。 一般的なランダム配列やほぼ順序付けられた配列の場合、3 方向クイックソートの効率は完璧ではありませんが、非常に許容できる範囲内です。 したがって、一部の言語では、3 方向クイック ソートが言語ライブラリ関数で使用されるデフォルトのソート アルゴリズムになります。たとえば、Java :) クイックソートの最適化では、パーティション間隔が小さい場合に挿入ソートを使用することが考えられます。 1. アルゴリズム図 2. コードの実装
積み重ね順序 ヒープソートとは、ヒープ データ構造を使用して設計されたソート アルゴリズムを指します。スタックは、完全な二分木を近似し、スタックの特性を満たす構造です。つまり、子ノードのキー値またはインデックスは常に親ノードよりも小さい (または大きい) です。ヒープソートは、ヒープの概念を使用してソートする選択ソートであると言えます。方法は2つあります。 最大トップヒープ: 各ノードの値は、その子ノードの値以上であり、ヒープソートアルゴリズムの昇順のために使用されます。 ミニトップヒープ: 各ノードの値は、その子ノードの値以下であり、ヒープソートアルゴリズムの降順のために使用されます。 ヒープソートの平均時間計算量は O(nlogn) です。 1. アルゴリズムの手順 1. ヒープH[0...n-1]を作成します。 2. ヒープ先頭 (最高値) とヒープ末尾を交換します。 3. ヒープサイズを1減らし、shift_down(1)を呼び出して、新しい配列の先頭データを対応する位置に調整します。 4. ヒープサイズが1になるまで手順2を繰り返します。 2. コードの実装
終わりと収穫 要約: データ構造とアルゴリズムを再学習する過程で、私はこれらのいわゆる**基礎知識**を学ぶことの重要性を十分に認識し、iOS開発のレベルをさらに向上させるためには、基本的なリンクを無視することはできないことを理解しました。また、この研究では、グラフのディープトラバーサルを使用して、埋もれたポイントを研究する過程でバックトラックソースを見つける問題を解決しました。 利益: > 1. 基本的なソートホワイトボードプログラミング > 2. ランタイムにカテゴリを追加する > 3. ランタイムの objc_msgSend() > 4. ディープコピーとシャローコピー > 5. GCDセマフォの使用 これを読んで何か得られたものがあれば、[Github](https://github.com/MisterBooo/Play-With-Sort-OC)** でスターを付けてください。 参考文献と参考文献 * [ソートアルゴリズムに関する GitBook オンライン ブック、「Top Ten Classic Sorting Algorithms」、JavaScript、Python、Go で実装](https://github.com/hustcc/JS-Sorting-Algorithm) * [JavaScript でデータ構造とアルゴリズムを学ぶ](https://juejin.im/post/594dfe795188250d725a220a) * [ソートアニメーション](https://github.com/JiongXing/JXSort) |
<<: AIがサイバーセキュリティにできること、できないこと
まずいくつか質問させてください。ビッグデータとは何でしょうか?人工知能とは何ですか?モノのインターネ...
2019年も残り1か月余りとなり、各種年間総括も迫ってまいりました。今年の AI の発展を振り返る...
[[274634]] 2019 年の秋が近づき、最初の 2 四半期が終了しようとしている今、今年前半...
近年のホットな言葉といえば、「人工知能」が挙げられます。昨年のChatGPTの人気爆発により、「AI...
舒城県裁判所杭埠法廷は最近、建設工事契約紛争事件の審理に法廷音声認識システムを使用した。これは、杭埠...
導入最も普及している IoT デバイスは小型で、電力が限られている傾向があります。これらは、組み込み...
論文「NeuRAD: 自動運転のためのニューラル レンダリング」は、Zenseact、チャルマース工...
画像マッチングは、2 つの画像間のピクセルの対応を推定することを目的とした、コンピューター ビジョン...
先ほど、Google Brainのシニア研究科学者であるBarret Zoph氏が、言語モデルのパラ...