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年代のロボット犬「考古学」

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

ブログ    
ブログ    

推薦する

AI、機械学習、ディープラーニングの謎を解く

ディープラーニング、機械学習、人工知能 — これらの流行語は分析の未来を表しています。この記事では、...

AIが予測分析アプリケーションに与える影響

人工知能 (AI) を使用した予測分析により、企業は過去のデータに基づいて将来の結果を予測し、運用効...

ドローンは思考によって制御される新しい方法を経験しており、その商業的展望は非常に刺激的です。

近年、ドローン業界は非常に急速な発展を遂げていると言えます。製品面では数量が大幅に増加し、種類もます...

AIベースのクラウド管理ツールではコンテキストが重要

AI を活用したクラウド管理ツールはまだ導入の初期段階にありますが、IT 業界の専門家は、このような...

科学者らがドローンを使って南極のペンギンの「国勢調査」を実施

最近、南極で初めて金色のペンギンが発見されました。このペンギンは「黄色いダイヤモンドを帯びている」と...

世界の半導体サプライチェーンにおけるリスクを排除するにはどうすればよいでしょうか?

過去数年間、テクノロジー業界は半導体サプライチェーンにおける前例のない混乱の影響を感じてきました。研...

自動化によってセキュリティアナリストがいなくなる可能性はありますか?

否定できない現実として、私たちは自動化の時代に入り、それに伴い人工知能 (AI)、機械学習 (ML)...

...

すべての AI エンジニアが知っておくべき AI ツールとフレームワークのトップ 10

競争で優位に立つために、このブログでは、TensorFlow、PyTorch、sci-kit-lea...

...

AIの冷却:ディープラーニングは万能薬ではない

[[202706]]近年、ディープラーニングはある程度の流行状態に入り、人々はこの技術を使ってあらゆ...

生成AIは昨年人気が高まったが、米国のIT関連の仕事の数はわずか700件しか増加しなかった

1月8日のニュースによると、2023年には、生成型人工知能が企業や投資家の間で大きなブームを引き起こ...

デンマークはロボット工学をリードしています – IoT はどのような役割を果たすのでしょうか?

デンマークは、1970年代初頭から国家政策の一環として風力タービンに投資した最初の国の一つであり、こ...