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使用新浪微博api上传图片到微博示例
Jan 10 Python
Python实现向QQ群成员自动发邮件的方法
Nov 19 Python
python解决网站的反爬虫策略总结
Oct 26 Python
python进阶_浅谈面向对象进阶
Aug 17 Python
python删除某个字符
Mar 19 Python
对python list 遍历删除的正确方法详解
Jun 29 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
Jul 16 Python
python yield关键词案例测试
Oct 15 Python
Django 简单实现分页与搜索功能的示例代码
Nov 07 Python
keras 读取多标签图像数据方式
Jun 12 Python
史上最详细的Python打包成exe文件教程
Jan 17 Python
Python图像处理库PIL详细使用说明
Apr 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
PHP无刷新上传文件实现代码
2011/09/19 PHP
php IP转换整形(ip2long)的详解
2013/06/06 PHP
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
PHP查看SSL证书信息的方法
2016/09/22 PHP
PHP实现支持CURL字符串证书传输的方法
2019/03/23 PHP
js nextSibling属性和previousSibling属性概述及使用注意
2013/02/16 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
2013/06/08 Javascript
JS 按钮点击触发(兼容IE、火狐)
2013/08/07 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
从0开始学Vue
2016/10/27 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
vue实现分页栏效果
2019/06/28 Javascript
vue history 模式打包部署在域名的二级目录的配置指南
2019/07/02 Javascript
利用d3.js实现蜂巢图表带动画效果
2019/09/03 Javascript
Vuejs中的watch实例详解(监听者)
2020/01/05 Javascript
JavaScript实现图片合成下载的示例
2020/11/19 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
跨平台python异步回调机制实现和使用方法
2013/11/26 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
速记Python布尔值
2017/11/09 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
详解Matplotlib绘图之属性设置
2019/08/23 Python
在vscode中配置python环境过程解析
2019/09/28 Python
python zip,lambda,map函数代码实例
2020/04/04 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
美国校园市场:OCM
2017/06/08 全球购物
Sneaker Studio法国:购买运动鞋
2018/06/08 全球购物
一道Delphi面试题
2016/10/28 面试题
2014年重阳节敬老活动方案
2014/09/16 职场文书
2015元旦节寄语
2014/12/08 职场文书
Mysql binlog日志文件过大的解决
2021/10/05 MySQL