python编程实现归并排序


Posted in Python onApril 14, 2017

因为上个星期leetcode的一道题(Median of Two Sorted Arrays)所以想仔细了解一下归并排序的实现。

还是先阐述一下排序思路:

首先归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。然后再将她们按照两个有序数组的样子合并起来。这样说起来可能很难理解,于是给出一张我画的图。

python编程实现归并排序

这里显示了归并排序的第一步,将数组按照middle进行递归拆分,最后分到最细之后再将其使用对两个有序数组进行排序的方法对其进行排序。

两个有序数组排序的方法则非常简单,同时对两个数组的第一个位置进行比大小,将小的放入一个空数组,然后被放入空数组的那个位置的指针往后 移一个,然后继续和另外一个数组的上一个位置进行比较,以此类推。到最后任何一个数组先出栈完,就将另外i一个数组里的所有元素追加到新数组后面。

由于递归拆分的时间复杂度是logN 然而,进行两个有序数组排序的方法复杂度是N该算法的时间复杂度是N*logN 所以是NlogN。

根据这波分析,我们可以看看对上图的一个行为。

当最左边的分到最细之后无法再划分左右然后开始进行合并。

第一次组合完成[4, 7]的合并

第二次组合完成[4, 7, 8]的合并

第三次组合完成[3, 5]的合并

第四次组合完成[3, 5, 9]的合并

第五次组合完成[3, 4, 5, 7, 8, 9]的合并结束排序。

下面放上python的代码

def merge(a, b):
 c = []
 h = j = 0
 while j < len(a) and h < len(b):
  if a[j] < b[h]:
   c.append(a[j])
   j += 1
  else:
   c.append(b[h])
   h += 1

 if j == len(a):
  for i in b[h:]:
   c.append(i)
 else:
  for i in a[j:]:
   c.append(i)

 return c


def merge_sort(lists):
 if len(lists) <= 1:
  return lists
 middle = len(lists)/2
 left = merge_sort(lists[:middle])
 right = merge_sort(lists[middle:])
 return merge(left, right)


if __name__ == '__main__':
 a = [4, 7, 8, 3, 5, 9]
 print merge_sort(a)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python运算符重载用法实例分析
Jun 01 Python
Python实现截屏的函数
Jul 25 Python
python读写json文件的简单实现
Apr 11 Python
Python读取sqlite数据库文件的方法分析
Aug 07 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
Jun 11 Python
在Python中使用filter去除列表中值为假及空字符串的例子
Nov 18 Python
在OpenCV里实现条码区域识别的方法示例
Dec 04 Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 Python
基于Pytorch SSD模型分析
Feb 18 Python
python 追踪except信息方式
Apr 25 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
Jun 10 Python
python 密码学示例——凯撒密码的实现
Sep 21 Python
python实现折半查找和归并排序算法
Apr 14 #Python
Python+Wordpress制作小说站
Apr 14 #Python
Python 中 list 的各项操作技巧
Apr 13 #Python
简单的python后台管理程序
Apr 13 #Python
python算法表示概念扫盲教程
Apr 13 #Python
Python常用算法学习基础教程
Apr 13 #Python
视觉直观感受若干常用排序算法
Apr 13 #Python
You might like
获取URL文件名后缀
2013/10/24 PHP
Thinkphp实现MySQL读写分离操作示例
2014/06/25 PHP
PHP闭包实例解析
2014/09/08 PHP
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
JS实现Select的option上下移动的方法
2016/03/01 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
理解JavaScript原型链
2016/10/25 Javascript
AngularJS动态绑定HTML的方法分析
2016/11/07 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
JavaScript实现创建自定义对象的常用方式总结
2018/07/09 Javascript
vue2配置scss的方法步骤
2019/06/06 Javascript
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
2020/04/27 Javascript
Python中关于字符串对象的一些基础知识
2015/04/08 Python
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
Python列表生成式与生成器操作示例
2018/08/01 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
2018/11/23 Python
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
python进阶之自定义可迭代的类
2019/08/20 Python
Pytorch之保存读取模型实例
2019/12/30 Python
django模板获取list中指定索引的值方式
2020/05/14 Python
判断单链表中是否存在环
2012/07/16 面试题
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
override和overload的区别
2016/03/09 面试题
金鑫耀Java笔试题
2014/09/06 面试题
servlet面试题
2012/08/20 面试题
工业自动化专业毕业生推荐信
2013/11/18 职场文书
同学会邀请书大全
2014/01/12 职场文书
党校培训自我鉴定范文
2014/04/10 职场文书
解放思想大讨论活动心得体会
2014/09/11 职场文书
教师四风问题对照检查材料
2014/09/26 职场文书
老人节主持词
2015/07/04 职场文书
干货干货!2019最新优秀创业计划书
2019/03/21 职场文书