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

ブログ    

推薦する

危険すぎる。Google は過去 12 年間、いまだにこれを公表しようとしない。

ボビー・アリン編纂者 | Yan Zheng幸いなことに、Google はこの技術を公開しませんでし...

2022QSリスト公開! MITがコンピュータサイエンスランキングでトップ、清華大学は15位、北京大学はトップ20から脱落

2022年QS世界大学分野別ランキングが発表されました!全体的には、21年前と比べて大きな変化はあり...

ロボットやAIが事故を起こした場合、誰が責任を負うのでしょうか?

[[348005]]自動運転車が歩行者をはねた場合、法的責任を負うのは誰でしょうか?所有者、製造者...

電力業界における人工知能開発の現状

今日は、人類が初めて電気を家庭や企業に供給するようになってから 140 年目の記念日です。電力産業は...

知っておくべき人工知能アルゴリズム トップ 10

人工知能 (AI) 技術の人気が高まるにつれ、さまざまなアルゴリズムがこの分野の発展を促進する上で重...

2019 年の JavaScript 向け機械学習ライブラリ トップ 6

通常、機械学習 (ML) の方法とアルゴリズムは、Python または R の 2 つのプログラミン...

スマートロボットについて知っておくべきことすべて

スマートロボットは、タスクをより効率的かつ正確に実行し、生産性を向上させ、人的エラーを削減するように...

NvidiaはAIでの成功を量子コンピューティングに応用しようとしている

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

AI時代ではモデルは大きいほど良い

今年も4分の3が過ぎた。テクノロジー業界から見れば、「室温超伝導」が実現可能であることが公式に証明さ...

人工知能技術は3つのレベルで社会を変える

[[282875]] 数十年前、日本は避けることの難しい一連の長期的経済課題に直面していました。 1...

...

人工知能アルゴリズムが核融合の応用に一歩近づく

核融合は現在一般的に使用されている核分裂法よりも安全で環境に優しいことはよく知られています。しかし、...

人工知能は破壊をもたらすのか? 「人工知能破壊論」への疑問と考察

映画『エイリアン:コヴェナント』では、マイケル・ファスベンダーが演じるバイオニックマンのデイビッドは...

私の国のロボット市場は活況を呈しているが、人材と技術的な問題はまだ解決する必要がある。

「スマート+」時代の到来とともに、人工知能、5G、モノのインターネット、ビッグデータなどの技術が徐...