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检测服务器是否正常
Feb 16 Python
Python的批量远程管理和部署工具Fabric用法实例
Jan 23 Python
Python THREADING模块中的JOIN()方法深入理解
Feb 18 Python
python使用append合并两个数组的方法
Apr 28 Python
Python验证文件是否可读写代码分享
Dec 11 Python
深入分析python数据挖掘 Json结构分析
Apr 21 Python
Python Scapy随心所欲研究TCP协议栈
Nov 20 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
May 13 Python
tensorflow使用指定gpu的方法
Feb 04 Python
浅谈django 模型类使用save()方法的好处与注意事项
Mar 28 Python
Python如何把Spark数据写入ElasticSearch
Apr 18 Python
Python3实现英文字母转换哥特式字体实例代码
Sep 01 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
一个简单的PHP投票程序源码
2007/03/11 PHP
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
2014/01/12 PHP
destoon调用discuz论坛中带图片帖子的实现方法
2014/08/21 PHP
php获取QQ头像并显示的方法
2014/12/23 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
2015/09/28 PHP
PHP常见的6个错误提示及解决方法
2016/07/07 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
javascript中创建对象的几种方法总结
2013/11/01 Javascript
js中hash和ico的关联分析
2015/02/05 Javascript
JavaScript实现打字效果的方法
2015/07/10 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
在vscode中统一vue编码风格的方法
2018/02/22 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
2018/09/05 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
jquery实现垂直手风琴导航栏
2020/02/18 jQuery
关于Js中new操作符的作用详解
2021/02/21 Javascript
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
简单讲解Python中的闭包
2015/08/11 Python
Python文本相似性计算之编辑距离详解
2016/11/28 Python
python中plot实现即时数据动态显示方法
2018/06/22 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
把django中admin后台界面的英文修改为中文显示的方法
2019/07/26 Python
如何利用python进行时间序列分析
2020/08/04 Python
python 操作excel表格的方法
2020/12/05 Python
美国乡村商店:Plow & Hearth
2016/09/12 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
编程实现去掉XML的重复结点
2014/05/28 面试题
傲慢与偏见电影观后感
2015/06/10 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP