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二维码生成库qrcode安装和使用示例
Dec 16 Python
python urllib爬取百度云连接的实例代码
Jun 19 Python
浅谈Python实现Apriori算法介绍
Dec 20 Python
Python----数据预处理代码实例
Mar 20 Python
Flask框架工厂函数用法实例分析
May 25 Python
Python Matplotlib 基于networkx画关系网络图
Jul 10 Python
浅析pandas 数据结构中的DataFrame
Oct 12 Python
python 爬虫百度地图的信息界面的实现方法
Oct 27 Python
python加载自定义词典实例
Dec 06 Python
Python udp网络程序实现发送、接收数据功能示例
Dec 09 Python
python3 实现调用串口功能
Dec 26 Python
如何用 Python 制作 GitHub 消息助手
Feb 20 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
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
Php无限级栏目分类读取的实现代码
2014/02/19 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
2011/09/02 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
详解JS 比较两个Json对象的值是否相等的实例
2013/11/20 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
jquery实现垂直和水平菜单导航栏
2020/08/27 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
vue2.0 路由不显示router-view的解决方法
2018/03/06 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
2018/08/27 Javascript
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
2018/09/19 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
element-ui table span-method(行合并)的实现代码
2018/12/20 Javascript
python中的列表推导浅析
2014/04/26 Python
基于Python实现的扫雷游戏实例代码
2014/08/01 Python
Python解析树及树的遍历
2016/02/03 Python
django站点管理详解
2017/12/12 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
Python编程图形库之Pillow使用方法讲解
2018/12/28 Python
Juicy Couture Beauty官方网站:香水和化妆品
2019/03/12 全球购物
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
一套C++笔试题面试题
2012/06/06 面试题
学雷锋月活动总结
2014/04/25 职场文书
超市商业计划书
2014/05/04 职场文书
党务公开方案
2014/05/06 职场文书
教师三严三实学习心得体会
2014/10/11 职场文书
2015年公务员个人工作总结
2015/04/24 职场文书
女性健康讲座主持词
2015/07/04 职场文书
幼儿园秋季开学通知
2015/07/16 职场文书
高中历史教学反思
2016/02/19 职场文书
餐厅营销的秘密:为什么老顾客会流水?
2019/08/08 职场文书
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL
macos系统如何实现微信双开? mac登录两个微信以上微信的技巧
2022/07/23 数码科技