当前位置:  编程技术>python

Python对两个有序列表进行合并和排序的例子

    来源: 互联网  发布时间:2014-10-08

    本文导语:  假设有2个有序列表l1、l2,如何效率比较高的将2个list合并并保持有序状态,这里默认排序是正序。 思路是比较简单的,无非是依次比较l1和l2头部第一个元素,将比较小的放在一个新的列表中,以此类推,直到所有的元素都被...

假设有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 list 合并连接字符串的方法
  • python合并文本文件示例
  • python 合并文件的具体实例
  • python中合并两个文本文件并按照姓名首字母排序的例子
  • python将多个文本文件合并为一个文本的代码(便于搜索)
  • python字符串排序方法
  • python 算法 排序实现快速排序
  • Python实现冒泡,插入,选择排序简单实例
  • python字典多条件排序方法实例
  • python 实现插入排序算法
  • python冒泡排序算法的实现代码
  • python 快速排序代码
  • python实现排序算法
  • python插入排序算法的实现代码
  • Python学习笔记_数据排序方法
  • python选择排序算法的实现代码
  • python算法学习之桶排序算法实例(分块排序)
  • python3.0 字典key排序
  • python快速排序代码实例
  • python计数排序和基数排序算法实例
  • python 实现归并排序算法
  • python 实现堆排序算法代码
  • python算法学习之基数排序实例
  • python算法学习之计数排序实例
  • Python中字典(dict)和列表(list)的排序方法实例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Python中变量交换的例子
  • java直接调用python脚本的例子
  • Python操作json数据的一个简单例子
  • python中使用urllib2获取http请求状态码的代码例子
  • python使用PyFetion来发送短信的例子
  • python中cPickle用法例子分享
  • Python 用户登录验证的小例子
  • shell脚本中执行python脚本并接收其返回值的例子
  • Python 命令行非阻塞输入的小例子
  • Python中使用urllib2防止302跳转的代码例子
  • python实现文件分组复制到不同目录的例子
  • Python中使用item()方法遍历字典的例子
  • Python中的CURL PycURL使用例子
  • python中使用OpenCV进行人脸检测的例子
  • 使用python调用浏览器并打开一个网址的例子
  • python实现DNS正向查询、反向查询的例子
  • Python实现的简单万年历例子分享
  • Python使用新浪微博API发送微博的例子
  • python中使用pyhook实现键盘监控的例子
  • Python创建、删除桌面、启动组快捷方式的例子分享
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • 让python同时兼容python2和python3的8个技巧分享
  • Python不使用print而直接输出二进制字符串
  • 使用setup.py安装python包和卸载python包的方法
  • Python中实现json字符串和dict类型的互转
  • 不小心把linux自带的python卸载了,导致安装一个依赖原python的软件不能安装,请问该怎么办?
  • python异常信息堆栈输出到日志文件
  • python读取csv文件示例(python操作csv)
  • python下用os.execl执行centos下的系统时间同步命令ntpdate
  • python基础教程之python消息摘要算法使用示例
  • Python namedtuple对象json序列化/反序列化及对象恢复


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3