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 相关文章推荐
python数据抓取分析的示例代码(python + mongodb)
Dec 25 Python
Tensorflow中的placeholder和feed_dict的使用
Jul 09 Python
python实现点对点聊天程序
Jul 28 Python
Flask实现图片的上传、下载及展示示例代码
Aug 03 Python
tensorflow实现加载mnist数据集
Sep 08 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
Jun 03 Python
Python OpenCV 使用滑动条来调整函数参数的方法
Jul 08 Python
Python 使用 docopt 解析json参数文件过程讲解
Aug 13 Python
python数据处理之如何选取csv文件中某几行的数据
Sep 02 Python
Python基于os.environ从windows获取环境变量
Jun 09 Python
pandas按条件筛选数据的实现
Feb 20 Python
Python基础 括号()[]{}的详解
Nov 07 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
一个SQL管理员的web接口
2006/10/09 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
2014/09/06 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
yii通过小物件生成view的方法
2016/10/08 PHP
Laravel学习教程之model validation的使用示例
2017/10/23 PHP
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
2012/01/15 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
js动画效果制件让图片组成动画代码分享
2014/01/14 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
js查找节点的方法小结
2015/01/13 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
微信小程序 实例应用(记账)详解
2016/09/28 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
vuex入门最详细整理
2020/03/04 Javascript
Vue基于iview table展示图片实现点击放大
2020/08/05 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
python修改操作系统时间的方法
2015/05/18 Python
python 性能提升的几种方法
2016/07/15 Python
Python爬取京东的商品分类与链接
2016/08/26 Python
django 删除数据库表后重新同步的方法
2018/05/27 Python
Python实现随机创建电话号码的方法示例
2018/12/07 Python
python使用 request 发送表单数据操作示例
2019/09/25 Python
python如何修改文件时间属性
2021/02/05 Python
Python之Sklearn使用入门教程
2021/02/19 Python
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
Java和Javasciprt的区别
2012/09/02 面试题
说出数据连接池的工作机制是什么?
2013/04/19 面试题
火车的故事教学反思
2014/02/11 职场文书
借款担保书范文
2014/05/13 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server