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 相关文章推荐
matplotlib简介,安装和简单实例代码
Dec 26 Python
Python使用分布式锁的代码演示示例
Jul 30 Python
python3 cvs将数据读取为字典的方法
Dec 22 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
Oct 17 Python
python turtle 绘制太极图的实例
Dec 18 Python
使用PyTorch将文件夹下的图片分为训练集和验证集实例
Jan 08 Python
Tensorflow限制CPU个数实例
Feb 06 Python
Python计算公交发车时间的完整代码
Feb 12 Python
浅谈ROC曲线的最佳阈值如何选取
Feb 28 Python
详解Python 中的容器 collections
Aug 17 Python
Matplotlib animation模块实现动态图
Feb 25 Python
七个Python必备的GUI库
Apr 27 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基础学习笔记
2007/03/18 PHP
php源代码安装常见错误与解决办法分享
2013/05/28 PHP
php查看网页源代码的方法
2015/03/13 PHP
php实现将Session写入数据库
2015/07/26 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
PHP封装的MSSql操作类完整实例
2016/05/26 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
javascript StringBuilder类实现
2008/12/22 Javascript
Javascript匿名函数的一种应用 代码封装
2010/06/27 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
以JavaScript来实现WordPress中的二级导航菜单的方法
2015/12/14 Javascript
Vue.js数据绑定之data属性
2017/07/07 Javascript
分享5个好用的javascript文件上传插件
2018/09/16 Javascript
Python Paramiko模块的安装与使用详解
2016/11/18 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
对Python3中bytes和HexStr之间的转换详解
2018/12/04 Python
python中时间转换datetime和pd.to_datetime详析
2019/08/11 Python
pygame实现贪吃蛇游戏(上)
2019/10/29 Python
在python中计算ssim的方法(与Matlab结果一致)
2019/12/19 Python
Python @property装饰器原理解析
2020/01/22 Python
Python创建临时文件和文件夹
2020/08/05 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
学生周末长期请假条
2014/02/15 职场文书
《乡愁》教学反思
2014/02/18 职场文书
跑操口号
2014/06/12 职场文书
舞蹈专业求职信
2014/06/13 职场文书
行政部经理助理岗位职责
2014/06/15 职场文书
汉语言文学毕业求职信
2014/07/17 职场文书
大学军训的体会
2014/11/08 职场文书
农村环境卫生倡议书
2015/04/29 职场文书
文化大革命观后感
2015/06/17 职场文书
2015年大学生暑期实习报告
2015/07/13 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
优秀范文:读《红岩》有感3篇
2019/10/14 职场文书
Python内置的数据类型及使用方法
2022/04/13 Python