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去除空格和换行符的实现方法(推荐)
Jan 04 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
Jul 25 Python
Python引用传值概念与用法实例小结
Oct 07 Python
django模板加载静态文件的方法步骤
Mar 01 Python
详解python-图像处理(映射变换)
Mar 22 Python
Python常见数据类型转换操作示例
May 08 Python
Python中的十大图像处理工具(小结)
Jun 10 Python
python实现跨excel sheet复制代码实例
Mar 03 Python
基于Python的一个自动录入表格的小程序
Aug 05 Python
如何基于Python爬虫爬取美团酒店信息
Nov 03 Python
python 元组和列表的区别
Dec 30 Python
Python3利用openpyxl读写Excel文件的方法实例
Feb 03 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 中的4种标记风格介绍
2012/05/10 PHP
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
分享PHP header函数使用教程
2013/09/05 PHP
一个加密JavaScript的开源工具PACKER2.0.2
2006/11/04 Javascript
利用javascript查看html源文件
2006/11/08 Javascript
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
javascript常见用法总结
2014/05/22 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
jquery validate和jquery form 插件组合实现验证表单后AJAX提交
2015/08/26 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
JS中取二维数组中最大值的方法汇总
2016/04/17 Javascript
jquery 中toggle的2种用法详解(推荐)
2016/09/02 Javascript
Bootstrap 模态框(Modal)插件代码解析
2016/12/21 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
vue 实现的树形菜的实例代码
2018/03/19 Javascript
全站最详细的Vuex教程
2018/04/13 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
[02:04]2018DOTA2亚洲邀请赛Secret赛前采访
2018/04/03 DOTA
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
Python在信息学竞赛中的运用及Python的基本用法(详解)
2017/08/15 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
Centos部署django服务nginx+uwsgi的方法
2019/01/02 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
小学优秀班集体申报材料
2014/05/25 职场文书
党员学习正风肃纪思想汇报
2014/09/12 职场文书
2014年财务经理工作总结
2014/12/08 职场文书
教师辞职信范文
2015/02/28 职场文书
员工手册编写范本
2015/05/14 职场文书
上班旷工检讨书
2015/08/15 职场文书
Python图片检索之以图搜图
2021/05/31 Python
浅谈MySQL之select优化方案
2021/08/07 MySQL