归并排序的Python实现

归并排序

学习到了Python中一个新语法

a = [[],[],[]]和b = [[]] * 3的区别

a = [[],[],[]]b = [[]] * 3
a中有三个empty list,为不同的对象,可以分开赋值b中有三个对象,同时指向一个empty list

链接参考:https://segmentfault.com/q/1010000004496004/a-1020000004498379

代码部分

定义了三个函数,依次将问题分解,这个代码是递归形式,以后会写写非递归形式:

def MergeSort(arr):
    Msort(arr,arr,1,len(arr)-1)

def Msort(SR,TR1,s,t):
    TR2 = [[]] * len(arr)  # 这个TR2只是为了用来保存下一级向上传过来的结果,也就是下一级的TR1
    if s==t:
        TR1[s]=SR[s]
    else:
        m=(s+t)//2
        Msort(SR,TR2,s,m)
        Msort(SR, TR2, m+1, t)
        Merge(TR2,TR1,s,m,t)  # 这里对TR1的改动,就是对调用它的Msort(SR,TR1,s,t)起作用


def Merge(SR,TR,i,m,n): # 最后一趟merge时,是对TR1的覆盖
     j=m+1
     k=i
     while i<=m and j<=n:
         if SR[i]<SR[j]:
             TR[k]=SR[i]
             # k+=1
             i+=1
         else:
             TR[k] = SR[j]
             # k += 1
             j += 1
         k+=1

     if i<=m:
         for l in range(m-i+1):
             TR[k+l] = SR[i+l]

     if j <= n:
         for l in range(n - j + 1):
             TR[k + l] = SR[j + l]


if __name__ == '__main__':
  arr=[0,50,10,90,30,70,40,80,60,20]
  print(arr)
  MergeSort(arr)
  print(arr)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值