Python实现归并排序

 
#程序主要分为三个部分,最外层的循环用来控制进行多少次归并排序,第二层循环用来控制在每次归并排序
#第三个循环是用来控制在每一次的归并排序中相邻的两个序列的合并
#归并排序需要额外的存储空间,空间的大小和原表的大小相同,而且每次归并的结果都是基于上一次排序的结果,所以可以循环利用这两张表
#第一个merge函数,用来将相邻的序列进行合并,需要指定两个序列的位置,方法是依次取出两个序列的最小元素,将两个最小的进行
#比较,选取最小的元素放在新表对应的位置,当有一个先结束的时候,直接将另一个表剩余的元素加进去
def merge(lfrom,lto,low,mid,high):
    i,j,k = low, mid,low #两个相邻序列的范围为[low,mid],[mid,low],合并之后的序列为[low,high]
    while i<mid and j<high:
        if lfrom[i] < lfrom[j]:
            lto[k] = lfrom[i]
            i += 1
        else:
            lto[k] = lfrom[j]
            j += 1
        k += 1

    while i < mid:
        lto[k] = lfrom[i]
        i += 1
        k += 1

    while j < high:
        lto[k] = lfrom[j]
        j += 1
        k += 1
#下面这个函数用来控制每一次的归并排序 ,llen表的总长度,slen每个分段的长度,在每一次合并的时候,首先两两合并,也就是说每次合并的范围为2*slen
def mege_pass(lfrom,lto,llen,slen):
    i = 0
    while i + 2 *slen < llen:
        merge(lfrom,lto,i,i+slen,i+2*slen)
        i += 2*slen
    if i +slen < llen:#还剩下两段序列,但是其中一个序列的长度小于slen
        merge(lfrom,lto,i,i+slen,llen)
    else:
        for j in range(i,llen):
            lto[j]= lfrom[j]

#最后一个函数控制归并排序的次数,归并结束的条件是最后一次归并后,子序列的长度等于原表的长度
#templst和lst轮流充当被归并表和归并完成后的表
def merge_sort(lst):
    slen,llen = 1,len(lst)
    templst = [None]*llen
    while slen < llen:
        mege_pass(lst,templst,llen,slen)
        slen *=2
        mege_pass(templst,lst, llen, slen)
        slen *=2
    return lst

print(merge_sort([3,4,8,0,1,2,15,5,20]))
#结果[0, 1, 2, 3, 4, 5, 8, 15, 20]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值