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获取一组数据里最大值max函数用法实例
May 26 Python
python使用Image处理图片常用技巧分析
Jun 01 Python
深入学习Python中的装饰器使用
Jun 20 Python
常见python正则用法的简单实例
Jun 21 Python
详解python脚本自动生成需要文件实例代码
Feb 04 Python
Python通过Django实现用户注册和邮箱验证功能代码
Dec 11 Python
python 3.6.5 安装配置方法图文教程
Sep 18 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
Oct 30 Python
TensorFlow打印输出tensor的值
Apr 19 Python
pytorch实现查看当前学习率
Jun 24 Python
PyTorch预训练Bert模型的示例
Nov 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
php中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
PHP内核探索之变量
2015/12/22 PHP
PHP 生成微信红包代码简单
2016/03/25 PHP
PHP格式化MYSQL返回float类型的方法
2016/03/30 PHP
Laravel中前端js上传图片到七牛云的示例代码
2017/09/04 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
ThinkPHP5框架中使用JWT的方法示例
2020/06/03 PHP
拖拉表格的JS函数
2008/11/20 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
手机号码,密码正则验证
2014/09/04 Javascript
jQuery遍历json中多个map的方法
2015/02/12 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
javascript 中的继承实例详解
2017/05/05 Javascript
Angularjs 事件指令详细整理
2017/07/27 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
2017/08/16 jQuery
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
2017/09/26 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
layui树形菜单动态遍历的例子
2019/09/23 Javascript
浅谈vuex的基本用法和mapaction传值问题
2019/11/08 Javascript
python 简单的多线程链接实现代码
2016/08/28 Python
Python+Wordpress制作小说站
2017/04/14 Python
css3动画鼠标放上图片逐渐变大鼠标离开图片逐渐缩小效果
2021/01/27 HTML / CSS
H5 canvas中width、height和style的宽高区别详解
2018/11/02 HTML / CSS
HTML5自定义data-* data(obj)属性和jquery的data()方法的使用
2012/12/13 HTML / CSS
MAC彩妆英国官网:M·A·C UK
2018/05/30 全球购物
中文系学生自荐信范文
2013/11/13 职场文书
医学生自我鉴定范文
2014/03/26 职场文书
百年校庆节目主持词
2014/03/27 职场文书
幼儿园教师师德师风演讲稿:爱我所爱 无悔青春
2014/09/10 职场文书
学校联谊协议书
2014/09/16 职场文书
关于运动会广播稿300字
2014/10/05 职场文书
小学运动会开幕词
2015/01/28 职场文书
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android