プログラミングにおいて、ソートはデータをより速く簡単に見つけるのに役立つ重要なアルゴリズムです。この記事では、ソート アルゴリズム分類子を使用して配列をソートし、その動作を理解します。この記事の読みやすさを確保するため、ここでは 4 つのソート アルゴリズムのみを紹介します。 - バブルソート
- 挿入ソート。
- マージソート。
- クイックソート
バブルソートバブルソートは、隣接する 2 つのオブジェクトの順序を比較し、予期しない順序になっている隣接するオブジェクトの位置を交換する単純なソートアルゴリズムです。動作手順は次のとおりです。 - 最初のオブジェクトと 2 番目のオブジェクトを比較し、最初のオブジェクトが 2 番目のオブジェクトより大きい場合はそれらを交換します。
- 2 番目のオブジェクトと 3 番目のオブジェクトを比較し、等しいかどうかを確認します。配列の最後の数値が比較されるまでこれを繰り返します。
- このプロセスを繰り返して、配列が左から右へ、小さいものから大きいものへと並べられるようにします。
コードは次のとおりです- # Python でのバブルソート
- def bubbleSort(配列):
-
- # 外側のループは配列の各要素にアクセスします
- i が範囲(len(配列))内にある場合:
-
- # 内側のループは配列の要素を外側のループの反復要素と比較します
- jが範囲( 0 、len(配列) - i - 1 )内にある場合:
-
- # 隣接する2つの要素を比較する
- 配列[j] > 配列[j + 1 ]の場合:
-
- # 要素が期待通りの順序でない場合は入れ替える
- temp = 配列[j]
- 配列[j] = 配列[j + 1 ]
- 配列[j+ 1 ] = temp
- データ = [ 5 , 4 , 3 , 2 , 1 ]
-
- バブルソート(データ)
- print( 'ソートされた配列' )
- 印刷(データ)
-
- #出力: [ 1 , 2 , 3 , 4 , 5 ]
挿入ソート挿入ソートも非常に簡単です。ソートされた部分とソートされていない部分の 2 つの部分に分かれています。ソートされていない部分の要素を選択し、ソートされた部分に正しく配置するだけです。カードゲームと同様に、私たちの手にはカテゴリーカードがあります。動作手順は次のとおりです。 - 配列を走査して最下位の要素のインデックスを見つけ、それを配列の最初の要素と交換します。
- 配列内の他の最も低い要素(最初の要素を除く)を見つけて、それを 2 番目の要素と交換し、配列の最後の要素までこの操作を繰り返します。
- この方法では、配列内の最も低い要素が左に移動され、最も高い要素が右に移動されるため、配列は順序どおりになります。
コードは次のとおりです。 - # Python でのソートアルゴリズム
- def挿入ソート(配列):
- 範囲( 1 、len(配列))内のステップの場合:
- キー = 配列[ステップ]
- j = ステップ - 1
- # キーをその左側の各要素と比較し、それより小さい要素が見つかるまで続けます
- j >= 0かつ key < array[j]の場合:
- 配列[j + 1 ] = 配列[j]
- j = j - 1
- # キーをそれより小さい要素の後に置きます。
- 配列[j + 1 ] = キー
-
- データ = [ 11 , 4 , 3 , 2 , 12 ]
-
- 挿入ソート(データ)
- print( "ソートされた配列" )
- 印刷(データ)
-
- #出力: [ 2 , 3 , 4 , 11 , 12 ]
マージソートマージソートは、分割統治アルゴリズムの原理に基づく、最も一般的に使用されるソートアルゴリズムです。配列を複数の部分に分割し、それらをソートし、最後にサブ部分をソートされた配列に結合します。理解を深めるために、その仕組みの手順を以下に示します。 - 各チャンクに単一の要素がなくなるまで、配列を小さなチャンクに分割します。
- 配列の各ブロックを比較し、最小値を左側に、最大値を右側に配置します。
- 理解しにくい場合は、この GIF を見てください。
コードは次のとおりです。 - # Python マージソート
- def mergeSort(配列):
- len(配列) > 1 の場合:
-
- # rは配列を2つに分割した後の分割点です
- r = len(配列)
- L = 配列[:r]
- M = 配列[r:]
-
- # 2つの半分を再帰的にソートする
- マージソート(L)
- マージソート(M)
-
- i = j = k = 0
-
- # LまたはMのどちらかの端に到達するまで、大きい方の要素LとMを選択し、A[p to r]の正しい位置に配置します。
- i < len(L)かつj < len(M)の場合:
- L[i] < M[j]の場合:
- 配列[k] = L[i]
- 私 += 1
- それ以外:
- 配列[k] = M[j]
- 1 + = 1
- 1 + = 1
-
- # LまたはMの要素をソートした後、残りの要素をA[p to r]に格納します
- i < len(L)の場合:
- 配列[k] = L[i]
- 私 += 1
- 1 + = 1
-
- j < len(M)の場合:
- 配列[k] = M[j]
- 1 + = 1
- 1 + = 1
- 配列 = [ 8 , 6 , 14 , 12 , 10 , 3 ]
-
- マージソート(配列)
- print( "ソートされた配列: " )
- 印刷(配列)
-
- #出力: [ 3 , 6 , 8 , 10 , 12 , 14 ]
クイックソートマージソートと同様に、クイックソートも分割統治アルゴリズムの原理に基づいたソートアルゴリズムです。要素をピボットとして選択し、ピボットを中心に配列を分割します。動作手順は次のとおりです。 - ランダムに選択できる転換点を選択します。ここでは、配列の最後の要素をピボットとして選択することを前提としています。
- ピボットより小さいすべての項目を配列の左側に配置し、ピボットより大きいすべての項目を配列の右側に配置します。
- ピボットの左側と右側で上記の手順を繰り返します。
- # Python でのクイックソート
- # パーティションの場所を見つける
- defパーティション(配列、最低、最高):
-
- # ここでは右端の要素をピボットとして選択します
- pivot = 配列[最高]
-
- # ポインタを最大の要素に設定する
- i = 最低 - 1
- # 各要素をピボット要素と比較する
- j が範囲内(最低、最高)の場合:
- 配列[j] <= ピボットの場合:
- 私 = 私 + 1
- # i の要素と j の要素を入れ替える
- (配列[i], 配列[j]) = (配列[j], 配列[i])
-
- # ピボット要素を i で指定された大きい方の要素と交換します
- (配列[i + 1 ], 配列[最高]) = (配列[最高], 配列[i + 1 ])
-
- # パーティションが完了した場所を返します
- i + 1を返す
- def quickSort(配列、最低、最高):
- 最低 < 最高の場合:
-
- # ピボット要素を見つける
- # ピボットより小さい要素は左側に配置されます
- # ピボットより大きい要素は右側に配置されます
- pi = パーティション(配列、最低、最高)
-
- # ピボットの左側への再帰呼び出し
- quickSort(配列、最低、π - 1 )
-
- # ピボットの右側への再帰呼び出し
- quickSort(配列、π + 1 、最高)
- 配列 = [ 9 , 8 , 3 , 2 , 1 , 10 , 7 , 6 , 19 ]
-
- サイズ = len(配列)
- クイックソート(配列、 0 、サイズ-1 )
- print( 'ソートされた配列は以下にあります' )
- 印刷(配列)
-
- #出力 [ 1 , 2 , 3 , 6 , 7 , 8 , 9 , 10 , 19 ]
|