8つのソートアルゴリズムのPython実装

8つのソートアルゴリズムのPython実装

この記事では、主に 8 つの一般的なソート アルゴリズムの基本概念とそれらの Python 実装を紹介します。Javaプログラマーの場合は、以前に紹介した Java プログラマーが習得しなければならない 8 つのソート アルゴリズムもご覧ください。

1. 挿入ソート

説明する

挿入ソートの基本的な操作は、ソートされた順序付きデータにデータを挿入し、番号が 1 つ増加した新しい順序付きデータを取得することです。このアルゴリズムは少量のデータのソートに適しており、時間の計算量は O(n^2) です。安定した選別方法です。挿入アルゴリズムは、ソートする配列を 2 つの部分に分割します。最初の部分には、最後の要素を除く配列のすべての要素が含まれ (配列に挿入用のスペースをもう 1 つ確保するため)、2 番目の部分にはこの要素 (つまり、挿入する要素) のみが含まれます。 *** 部分がソートされたら、この *** 要素をソートされた *** 部分に挿入します。

コードの実装

  1. def insert_sort(リスト):
  2. 挿入ソート
  3. count = len(リスト)
  4. i が範囲( 1 、カウント)内にある場合:
  5. キー = リスト[i]
  6. j = i - 1  
  7. j >= 0の場合:
  8. リスト[j] > キーの場合:
  9. リスト[j + 1 ] = リスト[j]
  10. リスト[j] = キー
  11. 1 -= 1 です 
  12. リターンリスト

2. シェルソート

説明する

シェルソートは挿入ソートの一種です。縮小増分ソートとも呼ばれるこのソートは、直接挿入ソート アルゴリズムのより効率的な改良版です。シェルソートは不安定なソートアルゴリズムです。この方法はDLによるものです。 Shell は 1959 年に提案されたことにちなんで命名されました。 シェルソートは、インデックスの特定の増分に従ってレコードをグループ化し、直接挿入ソートアルゴリズムを使用して各グループをソートします。増分が徐々に減少するにつれて、各グループに含まれるキーワードの数が増えていきます。増分が 1 に減少すると、ファイル全体が 1 つのグループに分割され、アルゴリズムが終了します。

コードの実装

  1. def shell_sort(リスト):
  2. # シェルソート
  3. count = len(リスト)
  4. ステップ = 2  
  5. グループ = カウント / ステップ
  6. グループ > 0の場合:
  7. i が範囲( 0 、グループ)内にある場合:
  8. j = i + グループ
  9. j < カウントの場合:
  10. k = j - グループ
  11. キー = リスト[j]
  12. k >= 0の場合:
  13. リスト[k] > キーの場合:
  14. リスト[k + グループ] = リスト[k]
  15. リスト[k] = キー
  16. k -= グループ
  17. j += グループ
  18. グループ /= ステップ
  19. リターンリスト

3. バブルソート

説明する

ソートする配列を繰り返し処理し、一度に 2 つの要素を比較して、順序が間違っている場合はそれらを交換します。シーケンスを訪問する作業は、交換が不要になるまで、つまりシーケンスがソートされるまで繰り返されます。

コードの実装

  1. def bubble_sort(リスト):
  2. # バブルソート
  3. count = len(リスト)
  4. i が範囲( 0 、カウント)内にある場合:
  5. j が範囲(i + 1 、カウント)内にある場合:
  6. リスト[i] > リスト[j]の場合:
  7. リスト[i]、リスト[j] = リスト[j]、リスト[i]
  8. リターンリスト

4. クイックソート

説明する

ソート パスにより、ソートするデータは 2 つの独立した部分に分割され、一方の部分のすべてのデータはもう一方の部分のすべてのデータよりも小さくなります。次に、この方法に従って、2 つの部分のデータが別々にすばやくソートされます。ソート プロセス全体を再帰的に実行して、データ全体を順序付けられたシーケンスに変換できます。

コードの実装

  1. def quick_sort(リスト、左、右):
  2. # クイックソート
  3. 左 >= 右の場合:
  4. リターンリスト
  5. キー = リスト[左]
  6. 低い = 左
  7. 高い = 右
  8. 左 < 右の場合:
  9. left < right かつ lists[right] >= key の場合:
  10. 右 -= 1  
  11. リスト[左] = リスト[右]
  12. left < right かつ lists[left] <= key の場合:
  13. 左 += 1  
  14. リスト[右] = リスト[左]
  15. リスト[右] = キー
  16. quick_sort(リスト、low、left - 1 )
  17. quick_sort(リスト、左 + 1 、高)
  18. リターンリスト

5. 直接選択ソート

説明する

基本的な考え方: 最初のパスでは、ソートする r1 ~ r[n] から最小のレコードを選択し、それを r1 と交換します。2 番目のパスでは、ソートする r2 ~ r[n] から最小のレコードを選択し、それを r2 と交換します。以下同様に行います。i 番目のパスでは、ソートする r[i] ~ r[n] から最小のレコードを選択し、それを r[i] と交換します。これにより、すべてのレコードがソートされるまで、順序付けられたシーケンスが拡大し続けます。

コードの実装

  1. def select_sort(リスト):
  2. # 選択ソート
  3. count = len(リスト)
  4. i が範囲( 0 、カウント)内にある場合:
  5. 最小 = i
  6. j が範囲(i + 1 、カウント)内にある場合:
  7. リスト[min] > リスト[j]の場合:
  8. 最小 = j
  9. リスト[最小]、リスト[i] = リスト[i]、リスト[最小]
  10. リターンリスト

6. ヒープソート

説明する

ヒープソートとは、ヒープツリー(ヒープ)のデータ構造を使用して設計されたソートアルゴリズムを指します。選択ソートの一種です。配列の特性を利用すると、指定したインデックスの要素をすばやく見つけることができます。ヒープは、完全なバイナリ ツリーである大きなルート ヒープと小さなルート ヒープに分割されます。ビッグ ルート ヒープの要件は、各ノードの値が親ノードの値以下であること、つまり A[PARENT[i]] >= A[i] です。配列の非降順ソートでは、ビッグ ルート ヒープが使用されます。これは、ビッグ ルート ヒープの要件に従って、最小の値がヒープの最上部にある必要があるためです。

コードの実装

  1. # ヒープを調整する
  2. def adjust_heap(リスト、i、サイズ):
  3. lchild = 2 * i + 1  
  4. rchild = 2 * i + 2  
  5. 最大 = i
  6. i < サイズ / 2 の場合:
  7. lchild < size かつlists[lchild] > lists[max]の場合:
  8. 最大 = lchild
  9. rchild < size かつlists[rchild] > lists[max]の場合:
  10. 最大 = rchild
  11. 最大値!= iの場合:
  12. リスト[max]、リスト[i] = リスト[i]、リスト[max]
  13. adjust_heap(リスト、最大、サイズ)
  14.  
  15. # ヒープを作成する
  16. def build_heap(リスト、サイズ):
  17. i が範囲( 0 、(size/ 2 ))[::- 1 ] の場合:
  18. adjust_heap(リスト、i、サイズ)
  19.  
  20. # ヒープソート
  21. def heap_sort(リスト):
  22. サイズ = len(リスト)
  23. build_heap(リスト、サイズ)
  24. i が範囲( 0 、サイズ)[::- 1 ]の場合:
  25. リスト[ 0 ]、リスト[i] = リスト[i]、リスト[ 0 ]
  26. ヒープを調整する(リスト、 0 、i)

7. マージソート

説明する

マージ ソートは、マージ操作に基づいた効果的なソート アルゴリズムです。このアルゴリズムは、分割統治法の非常に典型的な応用です。順序付けられたサブシーケンスをマージして、完全に順序付けられたシーケンスを取得します。つまり、最初に各サブシーケンスを順序付けし、次にサブシーケンスのセグメントを順序付けます。 2 つの順序付きリストが 1 つの順序付きリストに結合される場合は、双方向結合と呼ばれます。

マージのプロセスは、a[i]とa[j]のサイズを比較することです。a[i]≤a[j]の場合、最初の順序付きリストの要素a[i]をr[k]にコピーし、iとkにそれぞれ1を加算します。それ以外の場合は、2番目の順序付きリストの要素a[j]をr[k]にコピーし、jとkにそれぞれ1を加算します。順序付きリストの1つがなくなるまでこのサイクルを繰り返し、次に、もう1つの順序付きリストの残りの要素をrの添え字kから添え字tまでのユニットにコピーします。通常、マージソートアルゴリズムは再帰的に実装します。まず、ソートする区間 [s, t] を中間点で 2 つに分割し、次に左のサブ区間をソートし、次に右のサブ区間をソートします。最後に、マージ操作によって左の区間と右の区間を順序付けられた区間 [s, t] にマージします。

コードの実装

  1. def merge(左、右):
  2. i,j = 0 , 0  
  3. 結果 = []
  4. i < len(左)かつj < len(右)の場合:
  5. 左[i] <= 右[j]の場合:
  6. 結果.append(左[i])
  7. 私 += 1  
  8. それ以外
  9. 結果.append(右[j])
  10. 1 + = 1  
  11. 結果 += 左[i:]
  12. 結果 += 右[j:]
  13. 結果を返す
  14.  
  15. def merge_sort(リスト):
  16. # マージソート
  17. len(リスト) <= 1 の場合:
  18. リターンリスト
  19. num = len(リスト) / 2  
  20. 左 = merge_sort(リスト[:num])
  21. 右 = merge_sort(リスト[num:])
  22. マージを返す(左、右)

8. 基数ソート

説明する

基数ソートは「分散ソート」に属し、「バケット ソート」または「ビン ソート」とも呼ばれます。名前が示すように、キー値の部分的な情報を使用して、ソートする要素を特定の「バケット」に分散し、ソート効果を実現します。基数ソートは、時間計算量が O (nlog(r)m) の安定したソートです。ここで、r は基数、m はヒープの数です。場合によっては、基数ソートは他の安定したソート方法よりも効率的です。

コードの実装

  1. インポート数学
  2. 定義radix_sort(リスト、基数= 10 ):
  3. k = int (math.ceil(math.log(max(lists), radix)))
  4. バケット = [[] i範囲(基数)]
  5. iが範囲( 1 ,k+ 1 )内にある場合:
  6. リスト内のjの場合:
  7. バケット[j/(radix**(i- 1 )) % (radix**i)].append(j)
  8. リストを削除する[:]
  9. バケット内のzの場合:
  10. リスト += z
  11. del z[:]
  12. リターンリスト

<<:  SDNアプリケーションルーティングアルゴリズムを実装するためのツールであるNetworkx

>>:  Ruan Yifeng: Github のオブジェクトカウントアルゴリズム

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

推薦する

...

人工知能が消去された画像を完璧な結果で再現します!

革命的な新しい人工知能プログラムは、画像の欠けている部分をすべて完璧に再現できることをすぐに納得させ...

2021年の3つの主要なAIトレンド:IoT、データ駆動型の意思決定、サイバーセキュリティ

この記事は、公開アカウント「Reading the Core」(ID: AI_Discovery)か...

データ サイエンティストが知っておくべき 5 つのグラフ アルゴリズム

導入グラフ分析はデータサイエンティストの未来だからです。データ サイエンティストとして、私たちは p...

都市のモビリティの変化: スマートシティにおけるインテリジェント交通

持続可能で住みやすい都市空間を創造するために、世界中の都市がスマートシティの概念を採用しています。こ...

...

...

機械学習の概念をインタラクティブに学習できる 5 つの視覚化 Web サイト

多くの人が理解していない点の 1 つは、機械学習アルゴリズムが舞台裏でどのように機能するかということ...

顔認識セキュリティの脆弱性が再び明らかに、19のAndroidスマートフォンは15分でロック解除可能、必要なのはプリンター、A4用紙、メガネフレームだけ

最新の顔認識の脆弱性が明らかになり、テストされたすべての Android スマートフォンが脆弱である...

新型コロナウイルスに対して、最高のAI定量モデルでさえあまり信頼できない

[[335691]]ビッグデータダイジェスト制作出典: Wired編纂者:Roubao、Xia Ya...

小売業におけるロボット工学

小売業におけるロボット工学の応用により、企業は小売業のバリューチェーン全体を変革し、強化することがで...

...

今後数年間の人工知能研究が避けられない3つの重要な問題

現在、人工知能は産業のアップグレードを積極的に推進しており、製品の品質とコア能力を向上させています。...

視覚と言語の多粒度の調整を学習しますか? Byte は、新しいマルチモーダル事前トレーニング方法 X-VLM を提案しました。コードがオープンソース化されました。

前面に書かれた視覚言語の事前トレーニングにより、多くの視覚言語タスクのパフォーマンスが向上します。し...