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实现调用其他python脚本的方法
Oct 05 Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 Python
python得到windows自启动列表的方法
Oct 14 Python
python2和python3的输入和输出区别介绍
Nov 20 Python
python异步存储数据详解
Mar 19 Python
python画图--输出指定像素点的颜色值方法
Jul 03 Python
django的ORM操作 增加和查询
Jul 26 Python
jupyter notebook的安装与使用详解
May 18 Python
Python判断变量是否是None写法代码实例
Oct 09 Python
Python将list元素转存为CSV文件的实现
Nov 16 Python
使用Django的JsonResponse返回数据的实现
Jan 15 Python
python自动生成sql语句的脚本
Feb 24 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
第4章 数据处理-php数组的处理-郑阿奇
2011/07/04 PHP
PHP基础知识介绍
2013/09/17 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
2020/04/13 PHP
一个JS翻页效果
2007/07/23 Javascript
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
如何将JS的变量值传递给ASP变量
2012/12/10 Javascript
jquery中get,post和ajax方法的使用小结
2014/02/04 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
javascript图片预览和上传(兼容IE)
2017/03/15 Javascript
解决bootstrap中使用modal加载kindeditor时弹出层文本框不能输入的问题
2017/06/05 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
vue中的v-model原理,与组件自定义v-model详解
2020/08/04 Javascript
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
django模板结构优化的方法
2019/02/28 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
2019/11/15 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
pygame实现飞机大战
2020/03/11 Python
HTML5移动端开发遇见的东西
2019/10/11 HTML / CSS
手把手教你实现一个canvas智绘画板的方法
2019/03/04 HTML / CSS
电子商务专业学生的学习自我评价
2013/10/27 职场文书
年度考核自我鉴定
2013/11/09 职场文书
统计员岗位职责
2013/11/14 职场文书
儿媳婚宴答谢词
2014/01/14 职场文书
大学生开西餐厅创业计划书
2014/02/01 职场文书
小学生教师节演讲稿
2014/09/03 职场文书
2014年中学生检讨书大全
2014/10/09 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书
mysql多表查询-笔记七
2021/04/05 MySQL
MongoDB 常用的crud操作语句
2021/06/20 MongoDB