📜  迭代合并排序的Python程序(1)

📅  最后修改于: 2023-12-03 14:57:58.200000             🧑  作者: Mango

迭代合并排序的Python程序

简介

迭代合并排序(Iterative Merge Sort)是一种排序算法,它采用了分治策略来实现排序。与递归合并排序不同,迭代合并排序采用迭代的方法来实现分治,消除了递归的额外开销,提高了性能。

算法原理
  1. 将待排序数组按照一定规则分成多个子数组
  2. 将每个子数组进行内部排序
  3. 将相邻的子数组合并,直到最终数组有序
代码实现
Python代码
def merge_sort(arr):
    n = len(arr)
    curr_size = 1

    while curr_size < n:

        for left in range(0, n-1, curr_size*2):
            mid = left + curr_size - 1
            right = min(left + curr_size*2 - 1, n-1)

            merge(arr, left, mid, right)

        curr_size *= 2

def merge(arr, left, mid, right):
    n1 = mid - left + 1
    n2 = right - mid

    L = [arr[left + i] for i in range(n1)]
    R = [arr[mid + i + 1] for i in range(n2)]

    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

代码注解

merge_sort函数

该函数包括两个参数:待排序数组arr和数组长度n。该函数使用了while循环,每次将迭代尺寸curr_size乘以2进行迭代。左起点从0开始,右终点为n-1。

def merge_sort(arr):
    n = len(arr)
    curr_size = 1

    while curr_size < n:

        for left in range(0, n-1, curr_size*2):
            mid = left + curr_size - 1
            right = min(left + curr_size*2 - 1, n-1)

            merge(arr, left, mid, right)

        curr_size *= 2

merge函数

该函数包括四个参数:待排序数组arr、左起点left、中间点mid和右终点right。该函数主要用于对数组中的两个子数组进行合并,其中左边的子数组被认为是arr[left....mid],右边的子数组被认为是arr[mid+1....right]。

该函数首先计算出两个子数组的长度n1和n2,并创建两个数组L和R来存储分别对应的子数组。然后该函数使用while循环来比较L和R数组中的元素,并将较小的元素置于arr数组中。

最后,该函数将任何未被合并的元素依次放入arr数组中并返回该数组。

def merge(arr, left, mid, right):
    n1 = mid - left + 1
    n2 = right - mid

    L = [arr[left + i] for i in range(n1)]
    R = [arr[mid + i + 1] for i in range(n2)]

    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
总结

迭代合并排序是一种高效的排序算法,避免了递归带来的性能问题。该算法的核心思想是分治策略,通过将数组分成多个子数组,然后对子数组进行内部排序,最后再合并这些子数组。