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编程实现语音控制电脑
Apr 01 Python
详解python单例模式与metaclass
Jan 15 Python
基于Python数据可视化利器Matplotlib,绘图入门篇,Pyplot详解
Oct 13 Python
Python实现学生成绩管理系统
Apr 05 Python
Python smtplib实现发送邮件功能
May 22 Python
Python设计模式之外观模式实例详解
Jan 17 Python
pyqt5移动鼠标显示坐标的方法
Jun 21 Python
python批量图片处理简单示例
Aug 06 Python
python openCV获取人脸部分并存储功能
Aug 28 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
为什么python比较流行
Jun 19 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中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
PHP超级全局变量数组小结
2012/10/04 PHP
PHP使用array_merge重新排列数组下标的方法
2015/07/22 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
js 实现css风格选择器(压缩后2KB)
2012/01/12 Javascript
jQuery中RadioButtonList的功能及用法实例介绍
2013/08/23 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
javascript实现鼠标拖动改变层大小的方法
2015/04/30 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
2016/12/19 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
微信小程序滑动选择器的实现代码
2018/08/10 Javascript
在Vue methods中调用filters里的过滤器实例
2018/08/30 Javascript
小程序云函数调用API接口的方法
2019/05/17 Javascript
vue给对象动态添加属性和值的实例
2019/09/09 Javascript
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
webpack3.0升级4.0的方法步骤
2020/04/02 Javascript
用Python实现斐波那契(Fibonacci)函数
2016/03/25 Python
python3 实现的人人影视网站自动签到
2016/06/19 Python
python向已存在的excel中新增表,不覆盖原数据的实例
2018/05/02 Python
Selenium定位元素操作示例
2018/08/10 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
Python使用graphviz画流程图过程解析
2020/03/31 Python
python 的topk算法实例
2020/04/02 Python
Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法
2020/05/26 Python
大专毕业生求职信
2014/07/05 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
农村党员对照检查材料
2014/09/24 职场文书
综治维稳工作汇报
2014/10/27 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
Python 高级库15 个让新手爱不释手(推荐)
2021/05/15 Python
MySQL中CURRENT_TIMESTAMP的使用方式
2021/11/27 MySQL