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之折腾一下目录
Oct 24 Python
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 Python
在pycharm上mongodb配置及可视化设置方法
Nov 30 Python
Python3 修改默认环境的方法
Feb 16 Python
Python使用字典的嵌套功能详解
Feb 27 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
python3连接kafka模块pykafka生产者简单封装代码
Dec 23 Python
详解python中groupby函数通俗易懂
May 14 Python
Python 为什么推荐蛇形命名法原因浅析
Jun 18 Python
Python中的特殊方法以及应用详解
Sep 20 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
Feb 01 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 04 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.MVC的模板标签系统(二)
2006/09/05 PHP
PHP编程中字符串处理的5个技巧小结
2007/11/13 PHP
一家之言的经验之谈php+mysql扎实个人基本功
2008/03/27 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
php中的PHP_EOL换行符详细解析
2013/10/26 PHP
浅谈javascript的数据类型检测
2010/07/10 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
freemarker判断对象是否为空的方法
2015/08/13 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
js+canvas绘制五角星的方法
2016/01/28 Javascript
vue.js学习笔记:如何加载本地json文件
2017/01/17 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
使用webpack打包koa2 框架app
2018/02/02 Javascript
理解Koa2中的async&amp;await的用法
2018/02/05 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
2019/04/25 Javascript
详解jQuery如何实现模糊搜索
2019/05/10 jQuery
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
[02:47]2018年度DOTA2最佳辅助位选手4号位-完美盛典
2018/12/17 DOTA
Python聚类算法之DBSACN实例分析
2015/11/20 Python
Python解析最简单的验证码
2016/01/07 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
Django实现微信小程序的登录验证功能并维护登录态
2019/07/04 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
在线实验室测试:HealthLabs.com
2020/05/03 全球购物
《尊严》教学反思
2014/02/11 职场文书
热门专业求职信
2014/05/24 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
道德模范事迹材料
2014/12/20 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
法律服务所工作总结
2015/08/10 职场文书
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android