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提示No module named images的解决方法
Sep 29 Python
Python如何实现文本转语音
Aug 08 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
Jan 04 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
Jan 29 Python
python gensim使用word2vec词向量处理中文语料的方法
Jul 05 Python
在pycharm下设置自己的个性模版方法
Jul 15 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
Feb 07 Python
python简单的三元一次方程求解实例
Apr 02 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
Sep 23 Python
python 制作网站筛选工具(附源码)
Jan 21 Python
python 判断文件或文件夹是否存在
Mar 18 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 七大优势分析
2009/06/23 PHP
九个你必须知道而且又很好用的php函数和特点
2013/08/08 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
根据一段代码浅谈Javascript闭包
2010/12/14 Javascript
使用js 设置url参数
2013/07/08 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
实例详解jQuery的无new构建
2016/08/02 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
JavaScript中offsetWidth的bug及解决方法
2017/05/17 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
vue实例中data使用return包裹的方法
2018/08/27 Javascript
微信小程序登录session的使用
2019/03/17 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
javascript中可能用得到的全部的排序算法
2020/03/05 Javascript
JS 图片压缩原理与实现方法详解
2020/04/29 Javascript
微信小程序入门之绘制时钟
2020/10/22 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
2020/11/05 Javascript
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
python处理PHP数组文本文件实例
2014/09/18 Python
Python装饰器的函数式编程详解
2015/02/27 Python
Python实现文件按照日期命名的方法
2015/07/09 Python
python 开发的三种运行模式详细介绍
2017/01/18 Python
python opencv摄像头的简单应用
2019/06/06 Python
HTML5+CSS3网页加载进度条的实现,下载进度条的代码实例
2016/12/30 HTML / CSS
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
金融事务专业求职信
2014/04/25 职场文书
应聘会计求职信
2014/06/11 职场文书
领导班子自我剖析材料
2014/08/16 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
MySQL表的增删改查基础教程
2021/04/07 MySQL
python图片灰度化处理的几种方法
2021/06/23 Python