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同时兼容python2和python3的8个技巧分享
Jul 11 Python
python打开网页和暂停实例
Sep 30 Python
Python实现按学生年龄排序的实际问题详解
Aug 29 Python
在python中使用正则表达式查找可嵌套字符串组
Oct 24 Python
Python字典,函数,全局变量代码解析
Dec 18 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
Mar 19 Python
python实现播放音频和录音功能示例代码
Dec 30 Python
pandas 对日期类型数据的处理方法详解
Aug 08 Python
python保存log日志,实现用log日志画图
Dec 24 Python
python给图像加上mask,并提取mask区域实例
Jan 19 Python
python的flask框架难学吗
Jul 31 Python
virtualenv隔离Python环境的问题解析
Jun 21 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
PHP设计模式 注册表模式
2012/02/05 PHP
检查php文件中是否含有bom的函数
2012/05/31 PHP
ThinkPHP3.1新特性之Action参数绑定
2014/06/19 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
Yii2中SqlDataProvider用法示例
2016/09/22 PHP
详解Yii2高级版引入bootstrap.js的一个办法
2017/03/21 PHP
二级域名或跨域共享Cookies的实现方法
2008/08/07 Javascript
Javascript 函数中的参数使用分析
2010/03/27 Javascript
jquery 事件对象属性小结
2010/04/27 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
js运动框架_包括图片的淡入淡出效果
2013/05/11 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
2013/06/08 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
2016/01/15 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
vue之浏览器存储方法封装实例
2018/03/15 Javascript
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
Python线程创建和终止实例代码
2018/01/20 Python
Python 删除整个文本中的空格,并实现按行显示
2018/07/24 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
Python 中的函数装饰器和闭包详解
2021/02/06 Python
纯css3实现走马灯效果
2014/12/26 HTML / CSS
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
火山动力Java笔试题
2014/06/26 面试题
轻化专业学生实习自我鉴定
2013/09/20 职场文书
工商企业管理实习自我鉴定
2013/12/04 职场文书
初中学习计划书范文
2014/09/15 职场文书
暑假社会实践证明格式
2014/10/28 职场文书
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js