Python归并排序实现

简介

归并排序是一种基于分治策略的排序算法,它将数组分成两个子数组,然后分别对这两个子数组进行排序,最后将两个有序的子数组合并成一个有序的数组。这个过程可以通过递归来实现。

在本文中,我将教会你如何使用Python实现归并排序算法,并详细解释每一步所需的代码和其作用。

流程图

journey
    title 归并排序流程
    section 初始化
        给定一个待排序的数组
    section 归并排序
        将数组分成两个子数组
        对每个子数组进行排序(递归)
        合并两个有序的子数组
    section 返回结果
        返回排序后的数组

关系图

erDiagram
    SORT -- SUBDIVIDE: 分割成两个子数组
    SUBDIVIDE -- SORT: 递归排序
    SORT -- MERGE: 合并两个有序的子数组
    SUBDIVIDE -- MERGE: 合并两个有序的子数组
    MERGE -- SORT: 递归排序
    SORT -- RESULT: 返回结果

代码实现

下面是使用Python实现归并排序算法的代码:

def merge_sort(arr):
    # 递归终止条件
    if len(arr) <= 1:
        return arr
    
    # 将数组分成两个子数组
    mid = len(arr) // 2
    left = arr[:mid]
    right = arr[mid:]
    
    # 递归对子数组进行排序
    left = merge_sort(left)
    right = merge_sort(right)
    
    # 合并两个有序的子数组
    return merge(left, right)

def merge(left, right):
    merged = []
    i = 0
    j = 0
    
    # 比较两个子数组的元素,并将较小的元素添加到合并后的数组中
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            merged.append(left[i])
            i += 1
        else:
            merged.append(right[j])
            j += 1
    
    # 将剩余的元素添加到合并后的数组中
    merged.extend(left[i:])
    merged.extend(right[j:])
    
    return merged

代码解释

下面是上述代码中各部分的解释:

  1. merge_sort函数接受一个待排序的数组作为参数,首先判断递归终止条件,即数组长度小于等于1时直接返回数组。
  2. 接下来,将数组分成两个子数组,通过取中间索引mid来实现。使用Python的切片操作可以方便地实现这一步骤。
  3. 对两个子数组分别进行递归排序,即调用merge_sort函数对左子数组和右子数组进行排序,得到经过排序的左子数组left和右子数组right
  4. 最后,调用merge函数将两个有序的子数组合并成一个有序的数组,并返回结果。

对于merge函数,它接受两个有序的子数组leftright作为参数,首先创建一个空列表merged用于存放合并后的数组,然后使用两个指针ij分别指向左子数组和右子数组的起始位置。

接下来,比较两个子数组的元素,并将较小的元素添加到合并后的数组merged中。如果左子数组的当前元素小于右子数组的当前元素,则将左子数组的当前元素添加到merged中,并将左指针i向右移动一位;否则将右子数组的当前元素添加到merged中,并将右指针j向右移动一位。

最后,将剩余的元素添加到合并后的数组merged中,这一步是为了处理左子数组或右子数组中可能剩余的元素。

总结

在本文中,我介绍了如何使用Python实现归并排序算法。通过分割数组、递归排序和合并两个有序的子数组,我们