並べ替えアルゴリズム
ここでは、配列の最後に到達するまで、上位の要素をその隣の要素と交換します。これで、最上位の要素が最後の位置になります。そこで、境界を変更して、最後から 1 ずつ減らします。最悪の場合、配列をソートするには n 回反復する必要があります。
def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False # Last i elements are already in place, so we don't need to check them for j in range(0, n-i-1): # Swap if the element found is greater than the next element if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] # Swap the elements swapped = True if not swapped: break return arr
アルゴリズム -
時間計算量:
空間の複雑さ - O(1)、追加のメモリは必要ありません。
利点 -
追加のメモリは必要ありません。
要素が相対的な順序を維持するため安定しています。
欠点 -
アプリケーション -
ここでは、配列内の最小の要素を見つけて、それを最初の要素に置き換えます。次に、境界を 1 ずつ増やし、配列の最後に到達するまで同じ手順を繰り返します。
def selectionSort(a): i = 0 while i<len(a): smallest = min(a[i:]) index_of_smallest = a.index(smallest) a[i],a[index_of_smallest] = a[index_of_smallest],a[i] i=i+1 return a
アルゴリズム -
配列を反復処理して最小要素を見つけます。
最初の要素と交換し、ポインタを 1 増やします。
配列の最後に到達するまでこのプロセスを繰り返します。
時間計算量: 3 つのケースすべてで O(n2) の時間計算量があります: 最高、平均、最悪。 これは、最小限の要素を選択する必要があるためです。配列がすでにソートされているかどうかに関係なく、毎回それを交換します。
空間の複雑さ - O(1)、追加のメモリは必要ありません。
利点 -
追加のメモリは必要ありません。
バブルソートよりも少ないスワップが行われます。
欠点 -
時間計算量 - O(n2)。大規模なデータセットでは非常に高くなります。
等しい要素の相対的な順序が維持されないため、安定していません。
アプリケーション -
追加のストレージを必要としないため、メモリが限られたシステムでも使用できます。
これは、書き込み操作が遅いシステムなど、スワップ数を最小限に抑えることが重要なシステムで使用されます。
これは、要素の位置から配列の先頭まで逆方向に反復チェックすることで、ソートされていない要素を正しい位置に挿入するアルゴリズムです。
def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False # Last i elements are already in place, so we don't need to check them for j in range(0, n-i-1): # Swap if the element found is greater than the next element if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] # Swap the elements swapped = True if not swapped: break return arr
アルゴリズム -
配列の 2 番目の要素から開始して、最初の要素と比較します。現在の要素が最初の要素より小さい場合は、それらを交換します。
ここでポインターを増やし、3 番目の要素に対してこれを行います。2 番目と最初の要素と比較します。
残りの要素についても同じプロセスを繰り返し、前のすべての要素と比較し、適切な位置に挿入します。
時間計算量:
- 最良のケース - 配列がすでにソートされている場合、必要な反復は 1 回だけです。時間計算量は O(n)
- 平均的なケース - 配列がランダムにソートされている場合、時間計算量は O(n2)
- 最悪の場合 - 配列が降順の場合、n2 回の反復が必要になります。
空間の複雑さ - O(1)、追加のメモリは必要ありません。
利点 -
欠点 -
時間計算量 - O(n2)。大規模なデータセットでは非常に高くなります。
等しい要素の相対的な順序が維持されないため、安定していません。
アプリケーション -
マージ ソートは、分割統治アプローチに従うアルゴリズムです。これには 2 つの主なステップがあります。1 番目は配列を再帰的に分割し、2 番目は分割された配列をソート順にマージします。
def selectionSort(a): i = 0 while i<len(a): smallest = min(a[i:]) index_of_smallest = a.index(smallest) a[i],a[index_of_smallest] = a[index_of_smallest],a[i] i=i+1 return a
アルゴリズム -
中点を計算して配列を 2 つの半分に分割します。
各部分配列の長さが 1 になるまで分割を続けます。
両方の半分、つまり左半分と右半分でマージ関数を呼び出します。
マージプロセスには 3 つのポインターを使用します:
両方の半分を反復処理し、それらの要素を比較します。小さい方の要素をソートされた配列に挿入し、対応するポインタを 1 ずつインクリメントします。
配列全体がソートされるまで、このプロセスを再帰的に繰り返します。
時間計算量: マージ ソートの時間計算量は、最高、平均、最悪の 3 つのケースすべてで O(n log n) です。これは、配列が既にソートされているかどうかに関係なく、分割と結合のたびに同じ手順が実行されるためです。
O( log n ) - 配列サイズは分割フェーズ中の各ステップで半分になります。
O(n) - マージプロセス中に、すべての要素を 1 回反復する必要があります。
したがって、合計時間計算量は O (n) * O (log n) = O (n log n)
空間の複雑さ - O(n)、一時配列を保存するためにマージ プロセス中に追加のメモリが必要です。
利点 -
要素が相対的な順序を維持するため、安定しています。
大規模なデータセットであっても、時間計算量は O (n log n) です。
部分配列が独立してマージされるため、並列処理に適しています。
欠点 -
アプリケーション -
クイック ソートは、分割統治アプローチに従ったアルゴリズムです。ピボット要素を選択し、ピボットを正しい並べ替え位置に配置した後、ピボット要素を中心に配列を分割します。
最初のステップは、ピボット要素を選択し、ピボットを中心に配列を分割することです。ピボットより小さい要素はすべて左側にあり、ピボットより大きい要素はすべて右側にあります。これで、ピボットは正しいソート位置に配置されます。再帰的には、配列を 2 つの半分に分割することによって、同じプロセスが適用されます。前半にはピボット前の要素が含まれ、後半にはピボット後の要素が含まれます。このプロセスは、各部分配列の長さが 1 に達するまで繰り返されます。
def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False # Last i elements are already in place, so we don't need to check them for j in range(0, n-i-1): # Swap if the element found is greater than the next element if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] # Swap the elements swapped = True if not swapped: break return arr
アルゴリズム -
時間計算量:
1.最良のケース - 時間計算量 - O(n log n)、ピボットが配列を 2 つの等しい半分に分割する場合。
2.平均的なケース - 時間計算量 - O(n log n)、ピボットが配列を 2 つの等しい半分に分割する場合。しかし、必ずしも等しいわけではありません。
3.最悪の場合 - 時間計算量 - O(n2) 、時 -
すでにソートされた配列のピボットとして最小の要素が選択されます。
降順でソートされた配列内のピボットとして最大の要素が選択されます。
O( log n ) - 配列サイズは分割フェーズ中の各ステップで半分になります。
O(n) - 要素の順序付け中。
したがって、合計時間計算量は O (n) * O (log n) = O (n log n)
空間の複雑さ:
最良および平均のケース - O( log n) - 再帰スタックの場合。
最悪の場合 - O(n) - 再帰スタックの場合。
利点 -
欠点 -
アプリケーション -
ヒープ ソートは、比較ベースのソート アルゴリズムです。これは選択ソートの拡張機能です。ヒープ ソートでは、バイナリ ヒープを作成し、最大または最小の要素を最後の要素と交換します。次に、ヒープ サイズを 1 減らします。このプロセスは、ヒープの長さが 1 より大きくなるまで繰り返されます。
def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False # Last i elements are already in place, so we don't need to check them for j in range(0, n-i-1): # Swap if the element found is greater than the next element if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] # Swap the elements swapped = True if not swapped: break return arr
アルゴリズム -
a.その左側の子はインデックス 2i 1 にあります
b.その右側の子はインデックス 2i 2
にあります。時間計算量: ヒープ ソートの時間計算量は、最良、平均、最悪の 3 つのケースすべてで O(n log n) です。これは、配列が既にソートされているかどうかに関係なく、最大ヒープが作成され要素が交換されるたびに同じ手順が実行されるためです。
O( log n ) - 最大ヒープを作成します
O(n) - 最大ヒープが作成され、要素が n 回スワップされるため。
したがって、合計時間計算量は O (n) * O (log n) = O (n log n)
空間複雑度 : すべての場合 - O( log n) - 再帰的スタックの場合。
利点 -
欠点 -
アプリケーション -
カウンティング ソートは、非比較ベースのソート アルゴリズムです。これは、入力値の範囲がソート対象の要素の数に比べて小さい場合に特に効率的です。カウンティング ソートの背後にある基本的な考え方は、入力配列内の個別の各要素の頻度をカウントし、その情報を使用して要素を正しいソート位置に配置することです。
基数ソートは、サブルーチンとしてカウンティング ソートを使用します。数値の各桁にカウンティング ソートを適用し、配列内の最大の数値のすべての桁が処理されるまでソートを繰り返します。
def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False # Last i elements are already in place, so we don't need to check them for j in range(0, n-i-1): # Swap if the element found is greater than the next element if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] # Swap the elements swapped = True if not swapped: break return arr
def selectionSort(a): i = 0 while i<len(a): smallest = min(a[i:]) index_of_smallest = a.index(smallest) a[i],a[index_of_smallest] = a[index_of_smallest],a[i] i=i+1 return a
アルゴリズム -
配列内の最大数を見つけて、その桁数 (d) を決定します。数値の長さが d の場合、配列に対して Counting Sort が d 回呼び出されます。
コール カウンティング 配列内の各桁を 1 の位から順に並べ替え、次に 10 の位まで並べます。
カウントソート中:
時間計算量:
Counting Sort の時間計算量は O(n k) です。ここで、n は並べ替える要素の数、k は値の範囲 (インデックス配列のサイズ) です。この計算量は次の場合に有効です。 3 つのケースすべて: 最良、平均、最悪。
これは、配列が既にソートされているかどうかに関係なく、毎回同じ手順が実行されるためです。
基数ソート の時間計算量は d 倍に増加します。ここで、d は配列内の最大の数値の桁数です。時間計算量は O (d * (n k))
したがって、合計時間計算量は O (d) * O(n k) = O (d * (n k)) となります
空間複雑度: すべての場合 - O(n k)、n は入力配列の長さ、k はインデックス配列内の値の範囲です。
利点 -
欠点 -
アプリケーション -
以上が並べ替えアルゴリズム ||パイソン ||データ構造とアルゴリズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。