python的归并排序(mergesort)实现

本文介绍了一种经典的排序算法——归并排序,并提供了两种不同的实现方式:一种是返回新数组的递归版本,另一种是在原数组上进行排序的内部排序版本。通过随机生成的数据集验证了算法的有效性。

代码:

def merge(left, right):
    res = []
    while left and right:
        if left[0] < right[0]:
            res.append(left.pop(0))
        else:
            res.append(right.pop(0))
    res = res + left + right
    return res

def mergesort(lists):
    if len(lists) <= 1:
        return lists
    mid = len(lists)//2
    left = mergesort(lists[:mid])
    right = mergesort(lists[mid:])
    return merge(left,right)

内部排序版本

按照<算法导论>实现,在原数组上完成排序:

def merge(lst, l,mid,r):
    left = lst[l:mid+1] # + maxint
    right = lst[mid+1:r+1] # 
    k = l
    while left and right:
        if left[0] <= right[0]:
            lst[k] = left.pop(0)
        else:
            lst[k] = right.pop(0)
        k += 1
    tail = left if left else right
    for n in tail:
        lst[k] = n
        k += 1
    
def mergesort(lst,l,r):
    if l < r:
        mid = (l + r-1)//2
        mergesort(lst,l,mid)
        mergesort(lst,mid+1,r)
        merge(lst,l,mid,r)

测试:

for time in range(10):
    a = [random.randint(0,1000) for _ in range(100)] # 生成长度为100的整型数组,元素大小为(0,1000]
    res = mergesort(a)
    print(bool(res == sorted(a)))
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值