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的Scrapy爬虫框架使用代理进行采集的方法
Feb 18 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
Jun 14 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
May 08 Python
Python3.x爬虫下载网页图片的实例讲解
May 22 Python
Python3 Post登录并且保存cookie登录其他页面的方法
Dec 28 Python
Python 一键制作微信好友图片墙的方法
May 16 Python
Django实现发送邮件找回密码功能
Aug 12 Python
numpy.random.shuffle打乱顺序函数的实现
Sep 10 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
Oct 09 Python
python 实现图片上传接口开发 并生成可以访问的图片url
Dec 18 Python
Tensorflow tf.nn.atrous_conv2d如何实现空洞卷积的
Apr 20 Python
Python初学者必备的文件读写指南
Jun 23 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中计算中文字符串长度、截取中文字符串的函数代码
2011/08/09 PHP
PHP根据两点间的经纬度计算距离
2014/10/31 PHP
PHP Reflection API详解
2015/05/12 PHP
PHP 二维数组和三维数组的过滤
2016/03/16 PHP
highchart数据源纵轴json内的值必须是int(详解)
2017/02/20 PHP
Js控制滑轮左右滑动实例
2015/02/13 Javascript
PHP守护进程实例
2015/03/06 Javascript
Vue.js组件tree实现省市多级联动
2016/12/02 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
使用JS代码实现俄罗斯方块游戏
2018/08/03 Javascript
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
Vue的生命周期操作示例
2019/09/17 Javascript
python实现下载整个ftp目录的方法
2017/01/17 Python
Python实现的根据文件名查找数据文件功能示例
2018/05/02 Python
python爬虫实例详解
2018/06/19 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
GitHub上值得推荐的8个python 项目
2020/10/30 Python
英国泰坦旅游网站:全球陪同游览,邮轮和铁路旅行
2016/11/29 全球购物
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
营销与策划应届生求职信
2013/11/04 职场文书
后勤主管工作职责
2013/12/07 职场文书
宣传策划类求职信范文
2014/01/31 职场文书
财务情况说明书范文
2014/05/06 职场文书
提拔干部考察材料
2014/05/26 职场文书
诚信贷款承诺书
2014/05/30 职场文书
区政府领导班子个人对照检查材料
2014/09/25 职场文书
村主任群众路线教育实践活动个人对照检查材料思想汇报
2014/10/01 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers