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 は教育にどのように役立つのでしょうか?

ブログ    
ブログ    

推薦する

Javaの組み込みソートアルゴリズムをどうやって克服したか

Java 8 では、組み込みのソート アルゴリズムが大幅に最適化されました。整数やその他のプリミティ...

AI、ブロックチェーン、ロボット:テクノロジーは仕事の未来をどのように変えるのでしょうか?

編集者注:人工知能、ブロックチェーン、ロボットなどの破壊的な新技術が継続的に発展する中、人々はそれら...

研究に特化したChatGPTプラットフォーム:回答は完全に論文から取得され、無料で使用できます

より専門的な情報を入手する必要がある場合、文献を調べることはしばしば「頭痛の種」となる作業です。結局...

XiaoIceが超自然音声技術をリリースし、シリーズA資金調達の完了を発表

7月12日、XiaoIce社は新たな超自然音声技術をリリースした。この技術により、AI 音声の自然さ...

...

ChatGPT-4、Bard、Claude-2、Copilot空間タスクの正確性の比較

大規模言語モデル (LLM) を含む生成 AI は、エンコード、空間計算、サンプル データ生成、時系...

第 4 次小売革命を経て、WOT の 3 人の専門家が真のスマート小売とは何かを語ります。

[51CTO.comよりオリジナル記事] 6月21日、WOT2019グローバル人工知能技術サミット...

...

2021年のAIに関する10の大胆な予測の科学的分析 学術見出し

2020年は忘れられない年です。今年に入って、新型コロナウイルスの感染拡大に伴い、人工知能(AI)が...

Appleは、生成AIをiPhone上でローカルに実行できるようにするために、より多くの人材を採用している。

8月6日、今年初めから、生成型人工知能への熱狂がテクノロジー業界全体を席巻しているというニュースが...

国内メディアが大々的に報じた「世界初のAI地震監視システム」は的外れ

[[387555]]この記事はLeiphone.comから転載したものです。転載する場合は、Leip...

...

人工知能は労働力不足の重要な解決策とみられる

セリディアンは、無限の労働力を動員する力に焦点を当てた年次経営者調査の結果を発表しました。調査では、...