Python编程中归并排序算法的实现步骤详解


Posted in Python onMay 04, 2016

基本思想:归并排序是一种典型的分治思想,把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止。然后,就开始合并的过程,对每个子序列和另外一个子序列的元素进行比较,依次把小元素放入结果序列中进行合并,最终完成归并排序。
归并操作过程:

申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针达到序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
上述说法是理论表述,下面用一个实际例子说明:

例如一个无序数组

[6,2,3,1,7]

首先将这个数组通过递归方式进行分解,直到:

[6],[2],[3],[1],[7]

然后开始合并排序,也是用递归的方式进行:

两个两个合并排序,得到:

[2,6],[1,3],[7]

上一步中,其实也是按照本步骤的方式合并的,只不过由于每个list中一个数,不能完全显示过程。下面则可以完全显示过程。

初始:

a = [2,6] b = [1,3] c = []

第1步,顺序从a,b中取出一个数字:2,1 比较大小后放入c中,并将该数字从原list中删除,结果是:

a = [2,6] b = [3] c = [1]

第2步,继续从a,b中按照顺序取出数字,也就是重复上面步骤,这次是:2,3 比较大小后放入c中,并将该数字从原list中删除,结果是:

a = [6] b = [3] c = [1,2]

第3步,再重复前边的步骤,结果是:

a = [6] b = [] c = [1,2,3]

最后一步,将6追加到c中,结果形成了:

a = [] b = [] c = [1,2,3,6]

通过反复应用上面的流程,实现[1,2,3,6]与[7]的合并

最终得到排序结果

[1,2,3,6,7]

本文列举了三种python的实现方法:

方法1:将前面讲述的过程翻译过来了,略先拙笨

#! /usr/bin/env python
#coding:utf-8

def merge_sort(seq):
 if len(seq) ==1:
 return seq
 else:
 middle = len(seq)/2
 left = merge_sort(seq[:middle])
 right = merge_sort(seq[middle:])

 i = 0 #left 计数
 j = 0 #right 计数
 k = 0 #总计数

 while i < len(left) and j < len(right):
  if left[i] < right [j]:
  seq[k] = left[i]
  i +=1
  k +=1
  else:
  seq[k] = right[j]
  j +=1
  k +=1

 remain = left if i<j else right
 r = i if remain ==left else j

 while r<len(remain):
  seq[k] = remain[r]
  r +=1
  k +=1

 return seq

方法2:在按照顺序取数值方面,应用了list.pop()方法,代码更紧凑简洁

#! /usr/bin/env python
#coding:utf-8


def merge_sort(lst): #此方法来自维基百科

 if len(lst) <= 1:
 return lst

 def merge(left, right):
 merged = []

 while left and right:
  merged.append(left.pop(0) if left[0] <= right[0] else right.pop(0))

 while left:
  merged.append(left.pop(0))

 while right:
  merged.append(right.pop(0))

 return merged

 middle = int(len(lst) / 2) 
 left = merge_sort(lst[:middle])
 right = merge_sort(lst[middle:])
 return merge(left, right)

方法3:原来在python的模块heapq中就提供了归并排序的方法,只要将分解后的结果导入该方法即可。

#! /usr/bin/env python
#coding:utf-8


from heapq import merge

def merge_sort(seq):
 if len(seq) <= 1:
 return m
 else:  
 middle = len(seq)/2
 left = merge_sort(seq[:middle])
 right = merge_sort(seq[middle:])
 return list(merge(left, right))  #heapq.merge()

if __name__=="__main__":
 seq = [1,3,6,2,4]
 print merge_sort(seq)
Python 相关文章推荐
使用FastCGI部署Python的Django应用的教程
Jul 22 Python
Python Requests模拟登录实现图书馆座位自动预约
Apr 27 Python
python Flask 装饰器顺序问题解决
Aug 08 Python
DES加密解密算法之python实现版(图文并茂)
Dec 06 Python
Python中numpy模块常见用法demo实例小结
Mar 16 Python
PyQt5使用QTimer实现电子时钟
Jul 29 Python
Django密码存储策略分析
Jan 09 Python
PHP基于phpqrcode类库生成二维码过程解析
May 28 Python
Python3与fastdfs分布式文件系统如何实现交互
Jun 23 Python
使用Python操作MySQL的小技巧
Sep 10 Python
python用分数表示矩阵的方法实例
Jan 11 Python
Python实现邮件发送的详细设置方法(遇到问题)
Jan 18 Python
Python手机号码归属地查询代码
May 04 #Python
图文讲解选择排序算法的原理及在Python中的实现
May 04 #Python
浅谈插入排序算法在Python程序中的实现及简单改进
May 04 #Python
Python中使用插入排序算法的简单分析与代码示例
May 04 #Python
Python中函数参数设置及使用的学习笔记
May 03 #Python
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 #Python
Python使用urllib2模块抓取HTML页面资源的实例分享
May 03 #Python
You might like
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
PHP获得数组交集与差集的方法
2015/06/10 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
Laravel 集成 Geetest验证码的方法
2018/05/14 PHP
Iframe 自适应高度并实时监控高度变化的js代码
2009/10/30 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
前端面试题及答案整理(二)
2016/08/26 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
vue-router 中router-view不能渲染的解决方法
2017/05/23 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
Python实现的多线程http压力测试代码
2017/02/08 Python
Python 40行代码实现人脸识别功能
2017/04/02 Python
Python 类的特殊成员解析
2018/06/20 Python
Django-imagekit的使用详解
2020/07/06 Python
浅谈优化Django ORM中的性能问题
2020/07/09 Python
美国电视购物HSN官网:HSN
2016/09/07 全球购物
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
介绍一下Ruby中的对象,属性和方法
2012/07/11 面试题
实习护理工作自我评价
2013/09/25 职场文书
电钳专业个人求职信
2014/01/04 职场文书
班级寄语大全
2014/04/10 职场文书
镇副书记专题民主生活会对照检查材料思想汇报
2014/10/02 职场文书
开展批评与自我批评发言材料
2014/10/17 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书
详解Java实践之抽象工厂模式
2021/06/18 Java/Android
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB
Golang jwt身份认证
2022/04/20 Golang
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python