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操作MySQL数据库的方法分享
May 29 Python
Python首次安装后运行报错(0xc000007b)的解决方法
Oct 18 Python
使用python爬虫获取黄金价格的核心代码
Jun 13 Python
python实现DEM数据的阴影生成的方法
Jul 23 Python
django的csrf实现过程详解
Jul 26 Python
Django 重写用户模型的实现
Jul 29 Python
基于python使用tibco ems代码实例
Dec 20 Python
python同时遍历两个list用法说明
May 02 Python
浅谈Python中的模块
Jun 10 Python
python怎么删除缓存文件
Jul 19 Python
python爬虫中的url下载器用法详解
Nov 30 Python
Python Pygame实战在打砖块游戏的实现
Mar 17 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
简单采集了yahoo的一些数据
2007/02/14 PHP
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
2012/06/27 PHP
怎么在Windows系统中搭建php环境
2013/08/31 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
PHP正则判断一个变量是否为正整数的方法
2019/02/27 PHP
Javascript 汉字字节判断
2009/08/01 Javascript
JavaScript CSS修改学习第六章 拖拽
2010/02/19 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
JS动态修改图片的URL(src)的方法
2015/04/01 Javascript
jQuery中hover与mouseover和mouseout的区别分析
2015/12/24 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
2017/02/28 Javascript
面试常见的js算法题
2017/03/23 Javascript
教你快速搭建Node.Js服务器的方法教程
2017/03/30 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
2017/12/22 Javascript
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
简单的三步vuex入门
2018/05/20 Javascript
vue中vee validate表单校验的几种基本使用
2018/06/25 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
Vue通过配置WebSocket并实现群聊功能
2019/12/31 Javascript
Python 的 Socket 编程
2015/03/24 Python
详解如何为eclipse安装合适版本的python插件pydev
2018/11/04 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
师范生实习的个人自我鉴定
2013/10/20 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
歌颂祖国演讲稿
2014/05/04 职场文书
效能风暴心得体会
2014/09/04 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
2016年大学校运会广播稿件
2015/12/21 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书