Python の一般的なソート アルゴリズム | 挿入ソート、バブル ソート、選択ソート、ヒル ソート、マージ ソート、クイック ソート

python排序算法

  • Python の主要な並べ替えアルゴリズムをマスターする


1. ソートアルゴリズムの概要

並べ替えアルゴリズムは、コンピューター サイエンスで最も基本的で一般的に使用される問題の 1 つです。実際のアプリケーションでは、概要やクエリなどの操作を向上させるために、大量のデータを並べ替える必要があります。並べ替えアルゴリズムは、特定のルールに従ってデータを配置し、クエリ、計算、その他の操作をより便利かつ高速に行うことができます。
並べ替えアルゴリズムは、順序付けされていない要素のセットを特定の順序に並べ替えるアルゴリズムです。並べ替えのプロセスでは、要素のサイズを特定のルールに従って比較し、配置の目的を達成するために交換または移動する必要があります。一般的なソート アルゴリズムには、挿入ソート、バブル ソート、選択ソート、ヒル ソート、マージ ソート、クイック ソートなどが含まれます。ソートアルゴリズムが異なれば、長所と短所も異なるため、特定のニーズに応じて異なるアルゴリズムを選択する必要があります。

2. 挿入ソート

挿入ソートはシンプルで直観的なソート アルゴリズムであり、その基本的な考え方は、既存の順序付きリストにレコードを挿入して、新しい順序付きリストを取得することです。具体的な実装では、ソートされていない要素をソートされた部分に 1 つずつ挿入して、要素が徐々に順序付けされるようにすることができます。挿入ソート アルゴリズムの時間計算量は O(n^2)、空間計算量は O(1) です。
コード:

def insertion_sort(arr):
    for i in range(len(arr)):
        j = i
        while j > 0 and arr[j] < arr[j-1]:
            arr[j], arr[j-1] = arr[j-1], arr[j]
            j -= 1
    return arr


arr=[100,4,0,10,90,30,10,5,34,4,5,2,14,14,115,53,15]
insertion_sort(arr)

print(arr)
#运行结果
# [0, 2, 4, 4, 5, 5, 10, 10, 14, 14, 15, 30, 34, 53, 90, 100, 115]

3. バブルソーティング

バブル ソートも単純なソート アルゴリズムであり、その基本的な考え方は、隣接する 2 つの要素を比較および交換することによってソートを実現することです。具体的な実装では、ソート対象のシーケンスを繰り返し走査し、毎回隣接する 2 つの要素のサイズを比較し、シーケンス内のすべての要素がソートされるまで、正しい順序でない場合はそれらを交換します。バブル ソート アルゴリズムの時間計算量は O(n^2)、空間計算量は O(1) です。
コード:

def bubble_sort(arr):
    n = len(arr)
    for i in range(n - 1):
        for j in range(n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr



arr=[100,4,0,10,90,30,10,5,34,4,5,2,14,14,115,53,15]
bubble_sort(arr)

print(arr)
#运行结果
# [0, 2, 4, 4, 5, 5, 10, 10, 14, 14, 15, 30, 34, 53, 90, 100, 115]

4. 並べ替えを選択します

選択ソートはシンプルで直観的なソート アルゴリズムであり、その基本的な考え方は、毎回ソートするシーケンスから最小 (または最大) の要素を選択し、ソートされたシーケンスの最後に置くことです。実装すると、シーケンス全体がソートされるまで、ソートされていない部分から最小の要素を繰り返し選択し、ソートされた最後の要素と交換します。選択ソート アルゴリズムの時間計算量は O(n^2)、空間計算量は O(1) です。
コード:

def selection_sort(arr):
    n = len(arr)
    for i in range(n - 1):
        min_index = i
        for j in range(i + 1, n):
            if arr[j] < arr[min_index]:
                min_index = j
        arr[i], arr[min_index] = arr[min_index], arr[i]
    return arr
arr=[100,4,0,10,90,30,10,5,34,4,5,2,14,14,115,53,15]
selection_sort(arr)

print(arr)
#运行结果
# [0, 2, 4, 4, 5, 5, 10, 10, 14, 14, 15, 30, 34, 53, 90, 100, 115]

5. 丘の選別

ヒル ソートもシンプルで効果的なソート アルゴリズムであり、その基本的な考え方は、シーケンスをいくつかのサブシーケンスに分割することでソートを実現することです。具体的な実装では、最初にシーケンスをいくつかのサブシーケンスに分割し、サブシーケンスの内部が基本的に順序付けされるように各サブシーケンスに対して挿入ソートを実行します。その後、シーケンス全体が順序付けされるまでサブシーケンスの範囲を徐々に縮小します。Hill ソート アルゴリズムの時間計算量は O(nlogn)、空間計算量は O(1) です。
コード:

def shell_sort(arr):
    n = len(arr)
    gap = n // 2
    while gap > 0:
        for i in range(gap, n):
            j = i
            while j >= gap and arr[j] < arr[j - gap]:
                arr[j], arr[j - gap] = arr[j - gap], arr[j]
                j -= gap
        gap //= 2
    return arr

arr=[100,4,0,10,90,30,10,5,34,4,5,2,14,14,115,53,15]
shell_sort(arr)

print(arr)
#运行结果
# [0, 2, 4, 4, 5, 5, 10, 10, 14, 14, 15, 30, 34, 53, 90, 100, 115]

6. マージソート

マージ ソートは効率的な並べ替えアルゴリズムであり、その基本的な考え方は、2 つの順序付けられたサブシーケンスを 1 つの大きな順序付けられたシーケンスにマージすることです。具体的な実装では、最初にソート対象のシーケンスを再帰的にいくつかのサブシーケンスに分割し、次にシーケンス全体がソートされるまでこれらのサブシーケンスをマージします。マージ ソート アルゴリズムの時間計算量は O(nlogn)、空間計算量は O(n) です。

コード:

def merge_sort(arr):
    if len(arr) <= 1:
        return arr
    mid = len(arr) // 2
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])
    result = []
    i, j = 0, 0
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result
    
arr=[100,4,0,10,90,30,10,5,34,4,5,2,14,14,115,53,15]
merge_sort(arr)
print(arr)
#运行结果
# [0, 2, 4, 4, 5, 5, 10, 10, 14, 14, 15, 30, 34, 53, 90, 100, 115]

7. クイックソート

クイック ソートは効率的なソート アルゴリズムであり、その基本的な考え方は分割統治法によってソートを実現することです。具体的な実装では、まず「軸中心」となる要素を選択し、次にソートするシーケンスを 2 つの部分に分割し、左側の要素が軸中心よりも小さく、右側の要素が軸中心よりも小さくなるようにします。軸中心より大きい部分を再帰的に比較し、左右の部分を並べ替えるだけです。クイック ソート アルゴリズムの時間計算量は O(nlogn)、空間計算量は O(n) です。

コード:

python
def quick_sort(arr, left, right):
    if left >= right:
        return arr
    pivot = arr[left]
    i, j = left, right
    while i < j:
        while i < j and arr[j] >= pivot:
            j -= 1
        arr[i] = arr[j]
        while i < j and arr[i] < pivot:
            i += 1
        arr[j] = arr[i]
    arr[i] = pivot
    quick_sort(arr, left, i - 1)
    quick_sort(arr, i + 1, right)
    return arr

arr=[100,4,0,10,90,30,10,5,34,4,5,2,14,14,115,53,15]
quick_sort(arr)
print(arr)
#运行结果
# [0, 2, 4, 4, 5, 5, 10, 10, 14, 14, 15, 30, 34, 53, 90, 100, 115]

9. アルゴリズムの比較
実際のアプリケーションでは、ソート アルゴリズムが異なると長所と短所が異なるため、特定のニーズに応じて適切なアルゴリズムを選択する必要があります。以下では、上記の並べ替えアルゴリズムの時間計算量と空間計算量を比較します。

ソートアルゴリズム 平均時間計算量 最悪時間計算量 空間計算量
挿入ソート O(n^2) O(n^2) O(1)
バブルソート O(n^2) O(n^2) O(1 )
選択sortO(n ^2) O(n^2) O(1)
ヒル ソート O(nlogn) O(n^2) O(1)
マージ ソート O(nlogn) O(nlogn) O(n)
クイック ソート O(nlogn) O(n ^2) O(n)
上の表からわかるように、ソート アルゴリズムが異なれば、時間計算量と空間計算量も異なります。実際のアプリケーションでは、より良い結果を得るために、並べ替え操作に適切なアルゴリズムを選択する必要があります。

おすすめ

転載: blog.csdn.net/m0_58857684/article/details/130766946