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 26 Python
Python的pycurl包用法简介
Nov 13 Python
详解Python 数据库的Connection、Cursor两大对象
Jun 25 Python
Selenium定时刷新网页的实现代码
Oct 31 Python
使用Python和Prometheus跟踪天气的使用方法
May 06 Python
Pandas库之DataFrame使用的学习笔记
Jun 21 Python
利用Python的sympy包求解一元三次方程示例
Nov 22 Python
Python数据可视化:泊松分布详解
Dec 07 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
Mar 23 Python
Python中使用filter过滤列表的一个小技巧分享
May 02 Python
Django models文件模型变更错误解决
May 11 Python
基于Python采集爬取微信公众号历史数据
Nov 27 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去除换行符的方法小结(PHP_EOL变量的使用)
2013/02/16 PHP
window.open()弹出居中的窗口
2007/02/01 Javascript
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
获取服务器传来的数据 用JS去空格的正则表达式
2012/03/26 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
JavaScript基础篇(6)之函数表达式闭包
2015/12/11 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
2017/01/04 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
vue.js中Vue-router 2.0基础实践教程
2017/05/08 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
layui输入框只允许输入中文且判断长度的例子
2019/09/18 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
Python实现的数据结构与算法之链表详解
2015/04/22 Python
Python简单实现TCP包发送十六进制数据的方法
2016/04/16 Python
TensorFlow安装及jupyter notebook配置方法
2017/09/08 Python
使用python读取txt文件的内容,并删除重复的行数方法
2018/04/18 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
2019/07/10 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
美国汽车交易网站:Edmunds
2016/08/17 全球购物
巴西手表购物网站:eclock
2019/03/19 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
公务员总结性个人自我评价
2013/12/05 职场文书
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
升职自荐信怎么写
2015/03/05 职场文书
2016应届毕业生就业指导课心得体会
2016/01/15 职场文书
导游词之南京中山陵
2019/11/27 职场文书
JavaScript 与 TypeScript之间的联系
2021/11/27 Javascript