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 相关文章推荐
浅谈Django REST Framework限速
Dec 12 Python
Django 生成登陆验证码代码分享
Dec 12 Python
PYTHON基础-时间日期处理小结
May 05 Python
python 字符串和整数的转换方法
Jun 25 Python
详解Django中类视图使用装饰器的方式
Aug 12 Python
Python WEB应用部署的实现方法
Jan 02 Python
django的分页器Paginator 从django中导入类
Jul 25 Python
pytorch 彩色图像转灰度图像实例
Jan 13 Python
最新2019Pycharm安装教程 亲测
Feb 28 Python
PyCharm 在Windows的有用快捷键详解
Apr 07 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
Aug 18 Python
python 利用Pyinstaller打包Web项目
Oct 23 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
dedecms模版制作使用方法
2007/04/03 PHP
网页上facebook分享功能具体实现
2014/01/26 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
2017/02/05 PHP
用Juery网页选项卡实现代码
2011/06/13 Javascript
SOSO地图JS画出标注和中心点以html形式运行
2013/08/09 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
详解maxlength属性在textarea里奇怪的表现
2015/12/27 Javascript
JavaScript必知必会(七)js对象继承
2016/06/08 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
vue树形结构获取键值的方法示例
2018/06/21 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
vue实现局部刷新的实现示例
2019/04/16 Javascript
vue 需求 data中的数据之间的调用操作
2020/08/05 Javascript
[01:08]DOTA2次级职业联赛 - Shield战队宣传片
2014/12/01 DOTA
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
python编写弹球游戏的实现代码
2018/03/12 Python
python读取txt文件并取其某一列数据的示例
2019/02/19 Python
对Python强大的可变参数传递机制详解
2019/06/13 Python
python__name__原理及用法详解
2019/11/02 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
如何解决安装python3.6.1失败
2020/07/01 Python
pytorch简介
2020/11/11 Python
python实现xml转json文件的示例代码
2020/12/30 Python
canvas实现图片镜像翻转的2种方式
2020/07/22 HTML / CSS
罗马尼亚购物网站:Vivantis.ro
2019/07/20 全球购物
餐厅总经理岗位职责
2013/12/31 职场文书
《青蛙看海》教学反思
2014/04/23 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
工地安全生产标语
2014/06/06 职场文书
最美家庭活动方案
2014/08/31 职场文书
求职简历自我评价2015
2015/03/10 职场文书
学校会议通知范文
2015/04/15 职场文书
R9700摩机记
2022/04/05 无线电