Изучение различных методов реализации сортировки слиянием в Python

Сортировка — фундаментальная операция в информатике, а сортировка слиянием — популярный алгоритм сортировки, известный своей эффективностью и простотой. В этой статье мы рассмотрим различные методы реализации сортировки слиянием в Python, а также приведем примеры кода. Независимо от того, являетесь ли вы новичком или опытным программистом, эта статья предоставит вам полное представление о различных подходах к реализации сортировки слиянием.

Метод 1: рекурсивный подход
Рекурсивный подход — наиболее распространенный и интуитивно понятный способ реализации сортировки слиянием. Он следует парадигме «разделяй и властвуй», когда входной массив многократно делится на две половины, пока каждый подмассив не будет содержать только один элемент. Затем подмассивы объединяются в отсортированном виде.

def merge_sort(arr):
    if len(arr) <= 1:
        return arr

    mid = len(arr) // 2
    left_half = arr[:mid]
    right_half = arr[mid:]

    left_half = merge_sort(left_half)
    right_half = merge_sort(right_half)

    return merge(left_half, right_half)
def merge(left, right):
    result = []
    i = j = 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

    while i < len(left):
        result.append(left[i])
        i += 1

    while j < len(right):
        result.append(right[j])
        j += 1

    return result

Метод 2: итеративный подход
Хотя рекурсивная реализация элегантна, она может быть не самой эффективной из-за накладных расходов на вызовы функций. В качестве альтернативы мы можем реализовать сортировку слиянием итеративно, используя восходящий подход.

def merge_sort(arr):
    current_size = 1
    while current_size < len(arr) - 1:
        left = 0
        while left < len(arr) - 1:
            mid = min((left + current_size - 1), (len(arr) - 1))
            right = ((2 * current_size + left - 1, len(arr) - 1)[2 * current_size + left - 1 > len(arr) - 1])
            merge(arr, left, mid, right)
            left = left + current_size * 2
        current_size = 2 * current_size
def merge(arr, left, mid, right):
    n1 = mid - left + 1
    n2 = right - mid
    L = [0] * n1
    R = [0] * n2
    for i in range(0, n1):
        L[i] = arr[left + i]
    for i in range(0, n2):
        R[i] = arr[mid + i + 1]
    i = j = 0
    k = left
    while i < n1 and j < n2:
        if L[i] <= R[j]:
            arr[k] = L[i]
            i += 1
        else:
            arr[k] = R[j]
            j += 1
        k += 1
    while i < n1:
        arr[k] = L[i]
        i += 1
        k += 1
    while j < n2:
        arr[k] = R[j]
        j += 1
        k += 1

Метод 3: сортировка слиянием на месте
В предыдущих методах мы создавали новые массивы в процессе слияния. Однако можно выполнить сортировку слиянием на месте, то есть сортировка выполняется непосредственно в исходном массиве без использования дополнительного пространства.

def merge_sort(arr):
    if len(arr) > 1:
        mid = len(arr) // 2
        left_half = arr[:mid]
        right_half = arr[mid:]
        merge_sort(left_half)
        merge_sort(right_half)
        i = j = k = 0
        while i < len(left_half) and j < len(right_half):
            if left_half[i] < right_half[j]:
                arr[k] = left_half[i]
                i += 1
            else:
                arr[k] = right_half[j]
                j += 1
            k += 1
        while i < len(left_half):
            arr[k] = left_half[i]
            i += 1
            k += 1
        while j < len(right_half):
            arr[k] = right_half[j]
            j += 1
            k += 1

Сортировка слиянием — это эффективный алгоритм сортировки, гарантирующий временную сложность O(n log n). В этой статье мы рассмотрели три различных метода реализации сортировки слиянием в Python: рекурсивный подход, итеративный подход и подход на месте. Каждый метод имеет свои преимущества и может подходить для разных сценариев. Поняв эти реализации, вы сможете выбрать наиболее подходящую для ваших конкретных нужд.