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 相关文章推荐
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
Apr 11 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
May 02 Python
python使用线程封装的一个简单定时器类实例
May 16 Python
PyQt5每天必学之事件与信号
Apr 20 Python
基于numpy中数组元素的切片复制方法
Nov 15 Python
初探利用Python进行图文识别(OCR)
Feb 26 Python
Python中使用遍历在列表中添加字典遇到的坑
Feb 27 Python
python 两个一样的字符串用==结果为false问题的解决
Mar 12 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
Aug 07 Python
解决python3中os.popen()出错的问题
Nov 19 Python
SpringBoot首页设置解析(推荐)
Feb 11 Python
Autopep8的使用(python自动编排工具)
Mar 02 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面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
使用PHP导出Redis数据到另一个Redis中的代码
2014/03/12 PHP
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
jquery $(this).attr $(this).val方法使用介绍
2013/10/08 Javascript
探讨js字符串数组拼接的性能问题
2014/10/11 Javascript
JQuery实现可直接编辑的表格
2015/04/16 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
js实现点击链接后延迟3秒再跳转的方法
2015/06/05 Javascript
web前端开发JQuery常用实例代码片段(50个)
2015/08/28 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
基于jquery实现轮播特效
2016/04/22 Javascript
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
Vue仿手机qq的实例代码(demo)
2017/09/08 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
微信小程序API—获取定位的详解
2019/04/30 Javascript
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
[01:44]Ti10举办地公布
2019/08/25 DOTA
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
Python实现提取文章摘要的方法
2015/04/21 Python
详细解读Python中的__init__()方法
2015/05/02 Python
Python中optparser库用法实例详解
2018/01/26 Python
Pandas之drop_duplicates:去除重复项方法
2018/04/18 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
python之列表推导式的用法
2019/11/29 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
法国高保真音响和家庭影院商店:Son Video
2019/04/26 全球购物
毕业生求职推荐信
2013/11/04 职场文书
医院护士的求职信范文
2013/12/26 职场文书
诚信贷款承诺书
2014/05/30 职场文书
群众路线教育实践活动整改方案(个人版)
2014/10/25 职场文书
详解mysql三值逻辑与NULL
2021/05/19 MySQL
详解Python描述符的工作原理
2021/06/11 Python
MongoDB支持的数据类型
2022/04/11 MongoDB