python数据处理--归并排序

本文深入探讨了归并排序的循环实现方式,详细讲解了如何通过不断合并有序子序列来构建完整有序序列的过程,提供了具体代码示例,并通过实例验证了算法的有效性。

归并排序思路见百度百科:https://baike.baidu.com/item/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F/1639015?fr=aladdin

归并排序的代码实现有递归和循环两种,其中循环的代码思路如下:

  • 对于循环思路来讲,只有归并思路的并,没有分。这是因为,在分的过程中,任意元素的位置都没有发生变化,故一个序列可直接看做是已被分解的
  • 创建合并函数用于合并两个有序序列,输出结果为一个有序序列
  • 循环调用合并函数,从序列两个元素合并为一个序列,两个序列合并为一个序列。。。。直至最后合并为一个序列

代码如下:

def merge_sort(args):
    args_len=len(args)
    while args_len>1:
        i,list_args=0,[]
        while i<args_len:
            args1=args[i]
            try:
                args2=args[i+1]
            except:
                args2=[]
            list_args.append(merge(args1,args2))
            i+=2
        args_len=len(list_args)
        args=list_args
    return args[0]

#创建合并有序序列函数
def merge(args1,args2):
    list_args=[]
    dd = float("inf")
    for args in [args1,args2]:
        if type(args).__name__ in ('int','float'):
            list_args.append([args])
        else:
            list_args.append(list(args)) 
    args=[]
    args1,args2=list_args[0],list_args[1]
    args1.append(dd)
    args2.append(dd)
    while True:
        if args1[0]<args2[0]:
           args.append(args1[0])
           args1.pop(0)
        else:
             args.append(args2[0])
             args2.pop(0)
        if len(args1)==0 or len(args2)==0:
            args=args+args1+args2
            args.pop()
            args.pop()
            return args

测试一下:

list3=[2, 3, 1, 3, 5, 10, 3, 23, 442]

merge_sort(list3)
Out[87]: [[1, 2, 3, 3, 3, 5, 10, 23, 442]]

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值