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解决计数原理问题的方法
Aug 04 Python
flask + pymysql操作Mysql数据库的实例
Nov 13 Python
Python操作MySQL数据库的方法
Jun 20 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
Jul 22 Python
python取均匀不重复的随机数方式
Nov 27 Python
python 比较2张图片的相似度的方法示例
Dec 18 Python
python isinstance函数用法详解
Feb 13 Python
完美解决pycharm 不显示代码提示问题
Jun 02 Python
Python 日期与时间转换的方法
Aug 01 Python
Python3的进程和线程你了解吗
Mar 16 Python
代码复现python目标检测yolo3详解预测
May 06 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
adodb与adodb_lite之比较
2006/12/31 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
PHP魔术方法使用方法汇总
2016/02/14 PHP
PHP+Ajax实现验证码的实时验证
2016/07/20 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
jquery 分页控件实现代码
2009/11/30 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
document.documentElement和document.body区别介绍
2013/09/16 Javascript
JS分页效果示例
2013/10/11 Javascript
js 金额格式化来回转换示例
2014/02/23 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
jQuery动态改变多行文本框高度的方法
2016/09/07 Javascript
原生js实现水平方向无缝滚动
2017/01/10 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
webpack实现一个行内样式px转vw的loader示例
2018/09/13 Javascript
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
Python计算两个日期相差天数的方法示例
2017/05/23 Python
Python实现打印螺旋矩阵功能的方法
2017/11/21 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
2018/12/27 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
Python多进程编程常用方法解析
2020/03/26 Python
python3将变量输入的简单实例
2020/08/19 Python
python super()函数的基本使用
2020/09/10 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
BeautifulSoup中find和find_all的使用详解
2020/12/07 Python
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
美国波西米亚风格精品店:South Moon Under
2019/10/26 全球购物
编写strcpy函数
2014/06/24 面试题
opencv实现图像几何变换
2021/03/24 Python
镇创先争优活动总结
2014/08/28 职场文书
2014年建筑工作总结
2014/11/26 职场文书
辛亥革命观后感
2015/06/02 职场文书
女儿满月酒致辞
2015/07/29 职场文书