Python对两个有序列表进行合并和排序的例子


Posted in Python onJune 13, 2014

假设有2个有序列表l1、l2,如何效率比较高的将2个list合并并保持有序状态,这里默认排序是正序。

思路是比较简单的,无非是依次比较l1和l2头部第一个元素,将比较小的放在一个新的列表中,以此类推,直到所有的元素都被放到新的列表中。

考虑2个列表l1 = [2], l2 = [1],如何将他们合并呢?(注意:下面实现会改变l1和l2本来的值)

def signle_merge_sort(l1, l2):
    tmp = []
    if l1[0] < l2[0]:
        tmp.append(l1[0])
        tmp.extend(l2)
        del l2[0]
    else:
        tmp.append(l2[0])
        tmp.extend(l1)
        del l1[0]
    return tmp

这真的只能处理一个元素的情形,还不能解决问题,不过好歹我们有一个大概的思路了。如果有列表中2个元素,上面的方法就不行了。我们需要解决边界判断问题,即当l1或者l2有一个为空的时,将剩下的一个list加到排序结果的尾部。然后确保函数每次调用只处理一个元素,通过递归来解决问题。
def recursion_merge_sort1(l1, l2):
    tmp = []
    if len(l1) == 0:
        tmp.extend(l2)
        return tmp
    elif len(l2) == 0:
        tmp.extend(l1)
        return tmp
    else:
        if l1[0] < l2[0]:
            tmp.append(l1[0])
            del l1[0]
        else:
            tmp.append(l2[0])
            del l2[0]
        tmp += recursion_merge_sort1(l1, l2)
    return tmp

上面的程序有2个问题:if判断太多;每次都要初始化tmp,对内存使用似乎不太友好。考虑到程序在l1或者l2有一个为空的时候就终止,可以稍微改写一下:
def _recursion_merge_sort2(l1, l2, tmp):
    if len(l1) == 0 or len(l2) == 0:
        tmp.extend(l1)
        tmp.extend(l2)
        return tmp
    else:
        if l1[0] < l2[0]:
            tmp.append(l1[0])
            del l1[0]
        else:
            tmp.append(l2[0])
            del l2[0]
        return _recursion_merge_sort2(l1, l2, tmp)
def recursion_merge_sort2(l1, l2):
    return _recursion_merge_sort2(l1, l2, [])

但是对于Python而言,即使是尾递归,效率也不是那么高,为了避免爆栈,通常还是会用循环来做,再稍微改写一下:
def loop_merge_sort(l1, l2):
    tmp = []
    while len(l1) > 0 and len(l2) > 0:
        if l1[0] < l2[0]:
            tmp.append(l1[0])
            del l1[0]
        else:
            tmp.append(l2[0])
            del l2[0]
    tmp.extend(l1)
    tmp.extend(l2)
    return tmp

今天栽了个坑,好好反省,就是这样。
Python 相关文章推荐
python学习数据结构实例代码
May 11 Python
Python制作爬虫抓取美女图
Jan 20 Python
Python实现二分查找与bisect模块详解
Jan 13 Python
浅谈Python NLP入门教程
Dec 25 Python
对Python3中的input函数详解
Apr 22 Python
python中yaml配置文件模块的使用详解
Apr 27 Python
Python函数中参数是传递值还是引用详解
Jul 02 Python
33个Python爬虫项目实战(推荐)
Jul 08 Python
Flask框架单例模式实现方法详解
Jul 31 Python
关于pytorch多GPU训练实例与性能对比分析
Aug 19 Python
Pandas数据离散化原理及实例解析
Nov 16 Python
Python批量安装卸载1000个apk的方法
Apr 10 Python
用Python输出一个杨辉三角的例子
Jun 13 #Python
Python 的 with 语句详解
Jun 13 #Python
python学习笔记:字典的使用示例详解
Jun 13 #Python
Python urlopen()函数 示例分享
Jun 12 #Python
python教程之用py2exe将PY文件转成EXE文件
Jun 12 #Python
Python struct模块解析
Jun 12 #Python
深度剖析使用python抓取网页正文的源码
Jun 11 #Python
You might like
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
php 函数使用可变数量的参数方法
2017/05/02 PHP
javascript 打印页面代码
2009/03/24 Javascript
js函数的引用, 关于内存的开销
2012/09/17 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
javascript验证内容为数字以及长度为10的简单实例
2016/08/20 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
2017/05/17 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
vue实现移动端拖动排序
2020/08/21 Javascript
[02:54]DOTA2英雄基础教程 暗影牧师戴泽
2013/12/05 DOTA
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
Windows下安装python2和python3多版本教程
2017/03/30 Python
Python实现定时精度可调节的定时器
2018/04/15 Python
python实现自动获取IP并发送到邮箱
2018/12/26 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
2019/06/21 Python
python 批量修改 labelImg 生成的xml文件的方法
2019/09/09 Python
pandas使用之宽表变窄表的实现
2020/04/12 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
python中的时区问题
2021/01/14 Python
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
Sahajan美国:阿育吠陀护肤品牌
2021/01/09 全球购物
老干部工作先进集体事迹材料
2014/05/21 职场文书
植树造林的宣传标语
2014/06/23 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
热爱劳动主题班会
2015/08/14 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书