十大排序、七大查找算法python实现——归并排序(merge sort)

十大排序、七大查找算法python实现——归并排序(merge sort)

原理参考链接:https://www.cnblogs.com/onepixel/articles/7674659.html

 

归并排序的原理是,将无序数组不断划分,直到每个元素都为一个子数组,然后将这些有序的子数组两两之间,通过比较合并时的第一个元素的大小,将元素有序的合并至同一数组下。具体步骤如下:

  • 把长度为n的输入序列分成两个长度为n/2的子序列;
  • 对这两个子序列分别采用归并排序;
  • 将两个排序好的子序列合并成一个最终的排序序列。
def merge_sort(L):
    n = len(L)
    # 两个作用:
    # 1. 客户端传入原始序列只有一个元素或为空时,不用排序,直接返回
    # 2. 递归的退出条件。如果传入的序列元素个数为1时,不再拆分,返回
    if n <= 1:
        return L

    # 将传入的序列拆分成左右两个子序列,再分别递归
    mid = n // 2
    left = merge_sort(L[:mid])  # 特别注意:先递归左边的,直到子序列元素为1个,才依次向上返回。比如L = [54, 26, 93, 17, 77, 31, 44, 55, 20],则会先将 [54, 26, 93, 17] 归并排序好之后才会排右边的
    right = merge_sort(L[mid:])

    # 开始执行归并操作,将结果返回给上一层的 merge_sort() 调用栈
    return merge(left, right)


def merge(left, right):
    '''归并操作,使用可移动游标'''
    left_index = 0  # left序列的可移动的下标
    right_index = 0  # right序列的可移动的下标
    merged = []  # 用来存放最终排好序的元素

    while left_index < len(left) and right_index < len(right):  # 一旦 left序列 或 right序列 中的元素比较完成,就退出循环
        if left[left_index] < right[right_index]:
            merged.append(left[left_index])
            left_index += 1  # left序列的下标向右移动一位
        else:
            merged.append(right[right_index])
            right_index += 1  # right序列的下标向右移动一位

    merged = merged + left[left_index:]  # 如果 left序列 还有没比较的元素
    merged = merged + right[right_index:]  # 如果 right序列 还有没比较的元素
    return merged

如何理解代码呢?

首先,归并排序最重要的是划分数组,以得到一个树状结构的子数组,最底层没有子数组的长度都为1,在代码中,我们通过递归运算,通过mid = n // 2计算中间点,其中n为上一节点的子数组长度,来不断分割数组,通过left = merge_sort(L[:mid]),right = merge_sort(L[mid:]),将每一层的数组都划分为左右两个子数组,直到数组中只有1个元素,从而得到数组的树状图;

然后,从底层开始向上,不断合并相邻的子数组,从而得到一个有序的数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值