python实现归并排序

#归并排序,先把数组按中间分为2个单元,直至每个单元仅包含1个元素,然后依次合并2个单元至一临时数组
def Merge(str,start_index,end_index,mid,temp):
    j=start_index
    k=mid+1
    i=0
    while j<=mid and k<=end_index:
        if str[j]<str[k]:
            temp[i]=str[j]   #小的放前面
            j+=1
        else:
            temp[i]=str[k]
            k+=1
        i+=1
    while j<=mid:
        temp[i]=str[j]
        j+=1
        i+=1
    while k<=end_index:
        temp[i]=str[k]
        k+=1
        i+=1
    for s in range(0,i):
        str[start_index+s]=temp[s]


def MergeSort(str,start_index,end_index,temp):
    if start_index<end_index:
        mid=(start_index+end_index)//2
        MergeSort(str,start_index,mid,temp)
        MergeSort(str,mid+1,end_index,temp)
        Merge(str,start_index,end_index,mid,temp)




def Merge1(str,start_index,end_index,mid):
    j=start_index
    k=mid+1
    i=0
    temp=[d for d in range(len(str))]
    while j<=mid and k<=end_index:
        if str[j]<str[k]:
            temp[i]=str[j]
            j+=1
        else:
            temp[i]=str[k]
            k+=1
        i+=1
    while j<=mid:
        temp[i]=str[j]
        j+=1
        i+=1
    while k<=end_index:
        temp[i]=str[k]
        k+=1
        i+=1
    for s in range(0,i):
        str[start_index+s]=temp[s]


def MergeSort1(str,start_index,end_index):
    if start_index<end_index:
        mid=(start_index+end_index)//2
        MergeSort1(str,start_index,mid)
        MergeSort1(str,mid+1,end_index)
        Merge1(str,start_index,end_index,mid)
        
str=[49,27,49,3,38,1,13,76,97,65]
temp=[d for d in range(len(str))]


beginTime=time.clock()
MergeSort(str,0,len(str)-1,temp)
endTime=time.clock()
print("归并排序 临时数组递归前初始化好")
print(str)
print(endTime-beginTime)


str=[49,27,49,3,38,1,13,76,97,65]
beginTime=time.clock()
MergeSort1(str,0,len(str)-1)
endTime=time.clock()
print("归并排序1 临时数组在merge时创建")
print(str)
print(endTime-beginTime)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值