6つの主要なソートアルゴリズム

6つの主要なソートアルゴリズム

6 つの一般的なソート アルゴリズムの GIF アニメーションがあり、ソートの考え方をより簡単に理解するのに役立ちます。

6つの分類は以下の通りです👇

バブルソート、カウンティングソート、クイックソート、マージソート、挿入ソート、選択ソート、時間計算量は次のとおりです👇

ソートアルゴリズムの複雑さの分析
バブルソート
以下のGIFはZhihu Handsomeからのものです

バブルソート
名前の由来は、泡のように浮かんでいることからきています。よく考えてみると、隣接する 2 つの要素の大きさをその都度比較し、ゆっくりと「浮かび上がって」いくことを意味します。その考え方を見てみましょう。

「時間計算量 O(n*n)」

アイデア
1 隣接する要素を比較します。前者が後者よりも大きい場合は、それらの位置を交換します。
2 最初のペアから最後のペアまで、隣接する要素の各ペアに対して同じ操作を実行し、最後の要素が最大要素になるようにします。
3 各ループの最後の要素を除いて、n 個の要素に対して上記の手順を繰り返します。
4 並べ替えが完了するまで手順 1 ~ 3 を繰り返します。

コードの実装

  1. // 最も外側のループ制御の内容はループの数です
  2. // 各比較は、隣接する2つの間のサイズ関係です
  3. BubbleSort =関数(arr, flag = 0) とします。
  4. len = arr.lengthとします
  5.  
  6. (i = 0; i < len - 1; i++)の場合{
  7. (j = 0; j < len - 1 - i; j++)の場合{
  8. もし(arr[j] > arr[j + 1]) {
  9. [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
  10. }
  11. }
  12. }
  13. 戻りフラグ? arr.reverse(): arr
  14. }
  15.  
  16. arr = [2, 9, 6, 7, 4, 3, 1, 7]とします。
  17. console.log(バブルソート(arr, 1))

カウントソート
名前が示すように、その考え方は、配列要素を配列の添え字として使用し、一時配列を使用して要素の出現回数をカウントすることです。

配列内のデータは整数である必要があり、最大値と最小値の差は大きすぎてはいけません。データが負の場合、私が実装したソリューションにはこれに対する最適化があります。

「時間計算量: O(n+k)」

アイデア
1.差dを計算し、最小値が0未満の場合、それ自身を加算する

2. 統計配列を作成し、対応する要素の数を数える

3. 統計配列を、次の要素が前の要素の合計と等しくなるように変換します。つまり、ランキング配列です。

4. 元の配列を走査し、統計配列から正しい位置を見つけ、結果配列に出力します。

アニメーション

カウントソート
コードの実装

  1. // カウントソート
  2. countingSort =関数(arr, flag = 0) とします。
  3. min = arr[0]とします。
  4. 最大値= arr[0],
  5. len = 配列の長さ;
  6. // 最大値と最小値を見つける
  7. (i = 0; i < len; i++)の場合{
  8. max = Math.max (arr[i], max )です
  9. min = Math. min (arr[i], min )
  10. }
  11. // 1. 差dを計算し、最小値が0未満の場合、それ自身を加算する 
  12.  
  13. d = max - minとすると
  14. 追加= min < 0 ? - min : 0;
  15. //2. 統計配列を作成し、対応する要素の数を数える
  16. countArray = new Array(d+1+ add ).fill(0)とします。
  17. (i = 0; i < len; i++)の場合{
  18. demp = arr[i]- min + addとする 
  19. countArray[ demp ] += 1
  20. }
  21.      
  22. //3. 統計配列を変換します。次の要素は前の要素の合計に等しくなります。つまり、ランキング配列です。
  23. 合計0 とします。
  24.  
  25. // ここで走査する必要があるのは countArray 配列の長さです
  26. (i = 0 とすると、i < d+1+ が追加され、i++ となる){
  27. 合計+= countArray[i]
  28. countArray[i] =合計;
  29. }
  30. res = new Array(len) とします。
  31. //4. 元の配列を走査し、統計配列から正しい位置を見つけ、結果配列に出力します。
  32. (i = 0; i < len; i++)の場合{
  33. demp = arr[i] - min + addとする 
  34. res[ countArray[demp] -1 ] = arr[i]
  35. countArray[demp] --;  
  36. }
  37. 戻りフラグ? res.reverse(): res
  38. }
  39.  
  40. arr = [2, 9, 6, 7, 4, 3, 1, 7,0,-1,-2]とします。
  41. console.log(countingSort(arr))

クイックソート
基本的な考え方: ソート パスによって、ソートするレコードは 2 つの独立した部分に分割されます。レコードの一方の部分のキーワードがもう一方の部分のキーワードよりも小さい場合、レコードの 2 つの部分を個別にソートして、シーケンス全体の順序を実現できます。

「時間計算量: O(nlogn)」

アイデア<br /> 配列の中央の数字をカーディナリティとして選択し、このカーディナリティを配列から取り出して 2 つの配列コンテナーを準備し、配列をトラバースして、それらを 1 つずつカーディナリティと比較し、小さい方を左のコンテナーに、大きい方を右のコンテナーに配置します。
2 つのコンテナの要素を再帰的に処理し、処理されたデータとベースをサイズ別に配列にマージして返します。
アニメーション

クイックソート

  1. クイックソート =関数(arr) {
  2. // 再帰終了は配列の長さ1です
  3. (arr.length <= 1)の場合、 arrを返す
  4. // 中央の値のインデックスを取得し、Math.floor を使用して切り捨てます。
  5. インデックス= Math.floor(arr.length / 2)とします。
  6. // splice を使用して中間の値をインターセプトします。最初のパラメーターはインターセプト インデックスで、2 番目のパラメーターはインターセプトの長さです。
  7. // ここで pivot=arr[ index ] を使用すると、無限再帰エラーが発生します。
  8. // スプライスは元の配列に影響します
  9. ピボット = arr.splice(インデックス, 1)[0] とします。
  10. = [],
  11. = [];
  12. コンソール.log(ピボット)
  13. コンソールログ(arr)
  14. ( i = 0 とします; i < arr.length; i++) {
  15. ピボット > arr[i] の場合 {
  16. .push(arr[i])
  17. }それ以外{
  18. .push(arr[i])
  19. }
  20. }
  21. quickSort( left ).concat([pivot], quickSort( right ));を返します
  22. }
  23.  
  24. //arr = [2, 9, 6, 7, 4, 3, 1, 7]とします
  25. // console.log(クイックソート(arr))

マージソート

2つの順序付けられたシーケンスを1つの順序付けられたシーケンスに結合することを「マージ」と呼びます。

基本的な考え方とプロセス: 最初にシーケンスを再帰的に分解し、次にシーケンスをマージします (分割統治思考の典型的な応用)

「時間計算量: O(nlog(n))」

アイデア<br /> 配列を A と B の 2 つのグループに分割し、各グループに要素が 1 つだけになるまで 2 つのグループの分割を続けます。
グループは分割プロセスに従って徐々に結合されます。各グループには最初は要素が 1 つしかないため、グループは順序付けられていると見なすことができます。グループの結合は、順序付けられた 2 つの配列を結合するプロセスと見なすことができます。
各間隔に数字が 1 つだけになるまで、左側と右側の 2 つの小数点シリーズに対して 2 番目の手順を繰り返します。
アニメーション

マージソート
コードの実装

  1. const merge = ( left , right ) => { // 配列をマージする
  2.  
  3. 結果 = []
  4. // 遅延するにはshift()メソッドを使用し、最初の要素を削除して値を返します
  5. while (.長さ &&.長さ) {
  6. [0] <=[0])の場合{
  7. 結果.push(.shift())
  8. }それ以外{
  9. 結果.push(.shift())
  10. }
  11. }
  12. while (.長さ) {
  13. 結果.push(.shift())
  14. }
  15.  
  16. while (.長さ) {
  17. 結果.push(.shift())
  18. }
  19. 結果を返す
  20. }
  21.  
  22. mergeSort =関数(arr) {
  23. (arr.length <= 1)の場合
  24. リターン
  25. mid = Math.floor(arr.length / 2) とします。
  26. // 配列を分割する
  27. = arr.slice(0, mid) とします。
  28. = arr.slice(mid);
  29. mergeLeftArray = mergeSort() とします。
  30. mergeRightArray = mergeSort()
  31. merge(mergeLeftArray, mergeRightArray)を返します
  32. }
  33.  
  34. arr = [2, 9, 6, 7, 4, 3, 1, 7, 0, -1, -2]とします。
  35. console.log(マージソート(arr))

挿入ソート
名前が示すように、順序付けられたシーケンスを構築することで、ソートされていないデータの場合は、ソートされたシーケンス内で後ろから前へスキャンし、対応する位置を見つけて挿入します。

「時間計算量: O(n*n)」

アイデア<br /> 最初の要素から始めて、要素はソートされているとみなすことができます。
次の要素を取り出し、ソートされた要素の順序で後ろから前へスキャンします。
要素(すでにソートされている)が新しい要素より大きい場合は、要素を次の位置に移動します。
ソートされた要素が新しい要素以下になる位置が見つかるまで、手順 3 を繰り返します。
手順2~5を繰り返します。

コードの実装

  1. 挿入ソートを関数(arr)に代入する
  2. len = arr.lengthとします
  3.  
  4. (i = 0; i < len; i++)の場合{
  5. preIndex = i - 1 とします。
  6. cur = arr[i];
  7. (preIndex >= 0 && arr[preIndex] > cur) の場合 {
  8. arr[プレインデックス + 1] = arr[プレインデックス]
  9. プレインデックス--;  
  10. }
  11. arr[preIndex + 1] = cur
  12. }
  13. リターン
  14. }
  15.  
  16.  
  17. arr = [2, 9, 6, 7, 4, 3, 1, 7, 0, -1, -2]とします。
  18. console.log(挿入ソート(arr))

選択ソート
アイデア: ソートが完了するまで、ソートする配列要素から最大 (最小) の要素を毎回最初の要素として選択します。

「時間計算量 O(n*n)」

アイデア
1. n個の数字があり、それをn-1回ソートする必要がある
2. 最初に最小値を選択し、それを最初に置く
3. 2回目の最小値を選択し、2番目の場所に置く
4. このプロセスを繰り返す
5. n-1回目の最小値を選択し、n-1番目の位置に配置する
コードの実装

  1. selectSort = function (arr, flag = 0) とします。
  2. len = arr.lengthとします。
  3. 温度= 0;
  4.  
  5. // 合計len-1回のソート回数が必要です
  6. (i = 0; i < len - 1; i++)の場合{
  7. 温度= i;
  8. (j = i + 1; j < len; j++)の場合{
  9. もし (arr[j] < arr[ temp ])
  10. 温度= j;
  11. }
  12. // 各トリップはi番目の桁が最小値であることを確認します
  13. if ( temp !== i) {
  14. [arr[i], arr[ temp ]] = [arr[ temp ], arr[i]]
  15. }
  16. }
  17.  
  18. 戻りフラグ? arr.reverse(): arr
  19. }
  20.  
  21.  
  22.  
  23. arr = [2, 9, 6, 7, 4, 3, 1, 7, 0, -1, -2]とします。
  24. コンソールログ(selectSort(arr, 1))

<<:  これはボストンダイナミクスのロボット犬の父親でしょうか?米陸軍の1980年代のロボット犬「考古学」

>>:  マシンビジョンを超えて、ロボット認識完成計画

ブログ    
ブログ    
ブログ    

推薦する

ニューラルネットワークの詳細な説明、順方向伝播と逆方向伝播

主にロジスティック回帰について説明します。ロジスティック回帰には多くの基本概念が含まれており、ニュー...

機能テストケース自動生成アルゴリズム ペアワイズ

[[433685]]ペアワイズアルゴリズムとは何ですか?次のテストシナリオの場合:ブラウザ: M、O...

AIコードツールが人気、複雑な操作が数秒で簡単になり、ネットユーザー:VS Codeを放棄

最近、AIコードエディタCursorが人気になってきました—— GPT-3.5/GPT-4 に接続す...

...

InnoDB ストレージ エンジンの 3 つの行ロック アルゴリズムの図解と例の分析

[[415025]]この記事はWeChatの公開アカウント「Flying Veal」から転載したもの...

ザッカーバーグの45分間の詳細なインタビュー:今後10年間のVRと脳コンピューターインターフェースへの野望を明らかにする

[[386531]]誰もそこに頭を突っ込みたくないよ!ザッカーバーグ氏は脳コンピューターインターフェ...

デジタルヒューマンがアジア競技大会の聖火を灯す:ICCV 論文から見る Ant の生成 AI テクノロジーの新たな一面

9月23日夜、杭州アジア競技大会の開会式でメイントーチに火が灯されると、数億人のオンラインデジタル聖...

新学期にAIデビュー!南京の大学は顔認識技術を使って出席確認と学生管理を行っている

最近、中国薬科大学は試験的に教室に顔認識システムを導入しました。学生の出席を自動的に識別するだけでな...

...

マスク氏がxAIの目標を設定:汎用人工知能の実現期限は2029年

「xAIの目標は、宇宙を理解することを主な目的とする、真のAGI(人工汎用知能)を構築することです」...

アメリカの医師は新型コロナウイルスと戦うために人工知能をどのように活用しているのか

昨年、新型コロナウイルス感染症のパンデミックが始まったとき、クリーブランド・クリニックの医師で最高研...

カナダ工学アカデミー会員のソン・リャン氏:将来の人工知能システムはネットワークの形で存在するだろう

12月5日、国務院の承認を得て、科学技術部と河南省政府の共催により、12月6日から8日まで河南省鄭州...

百度の于有平氏:すべての開発者が平等かつ便利にAI機能にアクセスできるようにする

「すべての開発者が平等かつ便利にAI機能にアクセスできるようにするのが、私たちのビジョンであり、コミ...

自然言語処理 (NLP) 開発で注目に値するオープン ソース ツールにはどのようなものがありますか?

インテリジェント音声アシスタントとチャットボットは、現在人工知能のホットスポットであり、画期的な進歩...