Merge Sort的Python实现

归并排序是一种采用分治法的经典排序算法,通过将数组拆分成两部分,分别排序后再合并。为减少内存开销,使用索引而非复制子数组。在处理中点时,建议使用左闭右开的数组表示法,以防止索引错误。其优点包括较低的空间复杂度和稳定排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Merge Sort 是使用分治法的典型例子,将array分为两个子数组,子数组排序之后,再进行合并。显然,如果对于每个子数组进行复制,而不是就地排序,那么空间占用将达到O(nlg(n)),这是非常大的内存开销,所以这里通过索引的变化来定义子数组。这个问题的关键是索引的变化千万不能出错,推荐这种情况下统一使用左闭右开的数组表示法。

优点如下:

  • [left,right)直接分为[left,mid)+[mid,right)

  • [left,right)中元素的数目等于right-left。

另外,对于mid中点的计算,统一使用l+(r-l)//2的方式,如果是左开右闭,那么使用r-(r-l)//2,这样可以避免溢出。

def merge(arr,l,m,r): # 传入m参数是必要的,下有对应
    n1 = m-l # 简洁性可见一斑
    n2 = r-m
    L = [0]*n1 # 一般避免使用append,extend这些不定长度的list,占内存过大
    R = [0]*n2
    for i in range(n1):
        L[i] = arr[l+i]
    for j in range(n2):
        R[j] = arr[m+j]
    i = j =0
    k = l
    while i<n1 and j<n2: 通过i,j游标来判断是否结束,而不是通过数组为空判别
        if L[i]<R[j]:
            arr[k]=L[i]
            i += 1
        else:
            arr[k]=R[j]
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值