归并排序
学习到了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)