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 相关文章推荐
Python3基础之基本数据类型概述
Aug 13 Python
疯狂上涨的Python 开发者应从2.x还是3.x着手?
Nov 16 Python
《与孩子一起学编程》python自测题
May 27 Python
django富文本编辑器的实现示例
Apr 10 Python
python之pyqt5通过按钮改变Label的背景颜色方法
Jun 13 Python
python 处理微信对账单数据的实例代码
Jul 19 Python
python利用tkinter实现屏保
Jul 30 Python
使用Python的networkx绘制精美网络图教程
Nov 21 Python
基于Python下载网络图片方法汇总代码实例
Jun 24 Python
Pytorch 高效使用GPU的操作
Jun 27 Python
python中的yield from语法快速学习
Nov 06 Python
Python进程间的通信之语法学习
Apr 11 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
php 修改、增加xml结点属性的实现代码
2013/10/22 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
PHP生成树的方法
2015/07/28 PHP
PHP类的封装与继承详解
2015/09/29 PHP
Laravel手动分页实现方法详解
2016/10/09 PHP
yii 2.0中表单小部件的使用方法示例
2017/05/23 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
javascript删除字符串最后一个字符
2014/01/14 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
2014/12/14 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
2016/12/27 Javascript
JavaScript简单生成 N~M 之间随机数的方法
2017/01/13 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
element ui table 增加筛选的方法示例
2018/11/02 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
2019/04/12 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
Python进程间通信 multiProcessing Queue队列实现详解
2019/09/23 Python
python脚本后台执行方式
2019/12/21 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
python如何提取英语pdf内容并翻译
2020/03/03 Python
jupyter notebook实现显示行号
2020/04/13 Python
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
2018/10/08 HTML / CSS
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
Ray-Ban雷朋太阳眼镜英国官网:Ray-Ban UK
2019/11/23 全球购物
2014年电厂工作总结
2014/12/04 职场文书
Python实战之疫苗研发情况可视化
2021/05/18 Python
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python
详解Python中__new__方法的作用
2022/03/31 Python
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android