4つのPythonソートアルゴリズムをマスターする

4つのPythonソートアルゴリズムをマスターする

プログラミングにおいて、ソートはデータをより速く簡単に見つけるのに役立つ重要なアルゴリズムです。この記事では、ソート アルゴリズム分類子を使用して配列をソートし、その動作を理解します。この記事の読みやすさを確保するため、ここでは 4 つのソート アルゴリズムのみを紹介します。

  • バブルソート
  • 挿入ソート。
  • マージソート。
  • クイックソート

バブルソート

バブルソートは、隣接する 2 つのオブジェクトの順序を比較し、予期しない順序になっている隣接するオブジェクトの位置を交換する単純なソートアルゴリズムです。動作手順は次のとおりです。

  • 最初のオブジェクトと 2 番目のオブジェクトを比較し、最初のオブジェクトが 2 番目のオブジェクトより大きい場合はそれらを交換します。
  • 2 番目のオブジェクトと 3 番目のオブジェクトを比較し、等しいかどうかを確認します。配列の最後の数値が比較されるまでこれを繰り返します。
  • このプロセスを繰り返して、配列が左から右へ、小さいものから大きいものへと並べられるようにします。
コードは次のとおりです
  1. # Python でのバブルソート
  2. def bubbleSort(配列):
  3.   
  4. # 外側のループは配列の各要素にアクセスします
  5. i が範囲(len(配列))内にある場合:
  6.  
  7. # 内側のループは配列の要素を外側のループの反復要素と比較します
  8. jが範囲( 0 、len(配列) - i - 1 )内にある場合:
  9.  
  10. # 隣接する2つの要素を比較する
  11. 配列[j] > 配列[j + 1 ]の場合:
  12.  
  13. # 要素が期待通りの順序でない場合は入れ替える
  14. temp = 配列[j]
  15. 配列[j] = 配列[j + 1 ]
  16. 配列[j+ 1 ] = temp
  17. データ = [ 5 , 4 , 3 , 2 , 1 ]
  18.  
  19. バブルソート(データ)
  20. print( 'ソートされた配列' )
  21. 印刷(データ)
  22.  
  23. #出力: [ 1 , 2 , 3 , 4 , 5 ]

挿入ソート

挿入ソートも非常に簡単です。ソートされた部分とソートされていない部分の 2 つの部分に分かれています。ソートされていない部分の要素を選択し、ソートされた部分に正しく配置するだけです。カードゲームと同様に、私たちの手にはカテゴリーカードがあります。動作手順は次のとおりです。

  • 配列を走査して最下位の要素のインデックスを見つけ、それを配列の最初の要素と交換します。
  • 配列内の他の最も低い要素(最初の要素を除く)を見つけて、それを 2 番目の要素と交換し、配列の最後の要素までこの操作を繰り返します。
  • この方法では、配列内の最も低い要素が左に移動され、最も高い要素が右に移動されるため、配列は順序どおりになります。

コードは次のとおりです。

  1. # Python でのソートアルゴリズム
  2. def挿入ソート(配列):
  3. 範囲( 1 、len(配列))内のステップの場合:
  4. キー = 配列[ステップ]
  5. j = ステップ - 1  
  6. # キーをその左側の各要素と比較し、それより小さい要素が見つかるまで続けます
  7. j >= 0かつ key < array[j]の場合:
  8. 配列[j + 1 ] = 配列[j]
  9. j = j - 1  
  10. # キーをそれより小さい要素の後に置きます。
  11. 配列[j + 1 ] = キー
  12.  
  13. データ = [ 11 , 4 , 3 , 2 , 12 ]
  14.  
  15. 挿入ソート(データ)
  16. print( "ソートされた配列" )
  17. 印刷(データ)
  18.  
  19. #出力: [ 2 , 3 , 4 , 11 , 12 ]

マージソート

マージソートは、分割統治アルゴリズムの原理に基づく、最も一般的に使用されるソートアルゴリズムです。配列を複数の部分に分割し、それらをソートし、最後にサブ部分をソートされた配列に結合します。理解を深めるために、その仕組みの手順を以下に示します。

  • 各チャンクに単一の要素がなくなるまで、配列を小さなチャンクに分割します。
  • 配列の各ブロックを比較し、最小値を左側に、最大値を右側に配置します。
  • 理解しにくい場合は、この GIF を見てください。

コードは次のとおりです。

  1. # Python マージソート
  2. def mergeSort(配列):
  3. len(配列) > 1 の場合:
  4.  
  5. # rは配列を2つに分割した後の分割点です
  6. r = len(配列) //2  
  7. L = 配列[:r]
  8. M = 配列[r:]
  9.  
  10. # 2つの半分を再帰的にソートする
  11. マージソート(L)
  12. マージソート(M)
  13.  
  14. i = j = k = 0  
  15.  
  16. # LまたはMのどちらかの端に到達するまで、大きい方の要素LとMを選択し、A[p to r]の正しい位置に配置します。
  17. i < len(L)かつj < len(M)の場合:
  18. L[i] < M[j]の場合:
  19. 配列[k] = L[i]
  20. 私 += 1  
  21. それ以外
  22. 配列[k] = M[j]
  23. 1 + = 1  
  24. 1 + = 1  
  25.  
  26. # LまたはMの要素をソートした後、残りの要素をA[p to r]に格納します
  27. i < len(L)の場合:
  28. 配列[k] = L[i]
  29. 私 += 1  
  30. 1 + = 1  
  31.  
  32. j < len(M)の場合:
  33. 配列[k] = M[j]
  34. 1 + = 1  
  35. 1 + = 1  
  36. 配列 = [ 8 , 6 , 14 , 12 , 10 , 3 ]
  37.  
  38. マージソート(配列)
  39. print( "ソートされた配列: " )
  40. 印刷(配列)
  41.  
  42. #出力: [ 3 , 6 , 8 , 10 , 12 , 14 ]

クイックソート

マージソートと同様に、クイックソートも分割統治アルゴリズムの原理に基づいたソートアルゴリズムです。要素をピボットとして選択し、ピボットを中心に配列を分割します。動作手順は次のとおりです。

  • ランダムに選択できる転換点を選択します。ここでは、配列の最後の要素をピボットとして選択することを前提としています。
  • ピボットより小さいすべての項目を配列の左側に配置し、ピボットより大きいすべての項目を配列の右側に配置します。
  • ピボットの左側と右側で上記の手順を繰り返します。
  1. # Python でのクイックソート
  2. # パーティションの場所を見つける
  3. defパーティション(配列、最低、最高):
  4.  
  5. # ここでは右端の要素をピボットとして選択します
  6. pivot = 配列[最高]
  7.  
  8. # ポインタを最大の要素に設定する
  9. i = 最低 - 1  
  10. # 各要素をピボット要素と比較する
  11. j が範囲内(最低、最高)の場合:
  12. 配列[j] <= ピボットの場合:
  13. 私 = 私 + 1  
  14. # i の要素と j の要素を入れ替える
  15. (配列[i], 配列[j]) = (配列[j], 配列[i])
  16.  
  17. # ピボット要素を i で指定された大きい方の要素と交換します
  18. (配列[i + 1 ], 配列[最高]) = (配列[最高], 配列[i + 1 ])
  19.  
  20. # パーティションが完了した場所を返します
  21. i + 1を返す 
  22. def quickSort(配列、最低、最高):
  23. 最低 < 最高の場合:
  24.  
  25. # ピボット要素を見つける
  26. # ピボットより小さい要素は左側に配置されます
  27. # ピボットより大きい要素は右側に配置されます
  28. pi = パーティション(配列、最低、最高)
  29.  
  30. # ピボットの左側への再帰呼び出し
  31. quickSort(配列、最低、π - 1 )
  32.  
  33. # ピボットの右側への再帰呼び出し
  34. quickSort(配列、π + 1 、最高)
  35. 配列 = [ 9 , 8 , 3 , 2 , 1 , 10 , 7 , 6 , 19 ]
  36.  
  37. サイズ = len(配列)
  38. クイックソート(配列、 0 、サイズ-1 )
  39. print( 'ソートされた配列は以下にあります' )
  40. 印刷(配列)
  41.  
  42. #出力 [ 1 , 2 , 3 , 6 , 7 , 8 , 9 , 10 , 19 ]

<<:  革新を続ける: 6月のロボット研究開発の概要

>>:  AI は教育にどのように役立つのでしょうか?

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

AI、機械学習、ディープラーニングはOEMにとって重要な市場です

人工知能 (AI) は、世界中の業界関係者のビジネスのやり方を急速に変えています。 AI がビジネス...

この記事ではDiffアルゴリズムの使い方を説明します

[[420540]] 1. 基本Diff アルゴリズムは、仮想 DOM の最小限の更新を実装します。...

知能ロボットの主要技術:製造分野の知能化を推進

国家発展改革委員会から最近明らかになったところによると、インターネット、ビッグデータ、人工知能と実体...

Google は、DQN と同等で、より優れた一般化パフォーマンスを備えた 2 つの新しい強化学習アルゴリズムを実装しました。

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

AIが考古学に参入!科学者らはディープラーニングアルゴリズムを使用して、約100万年前に人類が火を使用していた証拠を発見した。PNASに掲載。

火の使用はホモ・サピエンスの進化における重要な要素であり、より複雑な道具の作成を可能にしただけでなく...

...

AIoTは自律時代を推進します。人工知能はIoTインフラに新たな競争上の優位性をもたらします。

人工知能とモノのインターネット (AIoT) は、テクノロジー分野における新しいプレーヤーの 1 つ...

...

米国の刑務所、受刑者の通話を分析するために人工知能を導入する計画

下院の主要委員会が、受刑者の通話を分析するための人工知能の使用に関する報告書の提出を求めたことにより...

ハリウッドのAIに対する攻撃は、AIの脚本の最新エピソードに書かれていた

今日まで、『ゲーム・オブ・スローンズ』の最終シーズンに失望していたかもしれません。しかし、AI にま...

...

...

AIがイノベーションの大きな原動力となる理由

近年、人工知能は新興技術から必需品へと徐々に変化してきました。より大規模な企業の問題に対する解決策を...

2018年大学入試トップ学生調査:60%以上がビジネス・経営学専攻を希望、人工知能などの専攻にも関心

毎年、大学入試の結果が発表されると、多くの受験生が専攻の選択に悩みます。では、優秀な学生たちはこのよ...