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中的特殊语法:filter、map、reduce、lambda介绍
Apr 14 Python
python基于pyDes库实现des加密的方法
Apr 29 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
May 07 Python
numpy判断数值类型、过滤出数值型数据的方法
Jun 09 Python
python pygame模块编写飞机大战
Nov 20 Python
在python中使用xlrd获取合并单元格的方法
Dec 26 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
Oct 22 Python
python创建学生成绩管理系统
Nov 22 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
Feb 11 Python
python 日志 logging模块详细解析
Mar 31 Python
浅析python 动态库m.so.1.0错误问题
May 09 Python
Python中request的基本使用解决乱码问题
Apr 12 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
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
支持中文、字母、数字的PHP验证码
2015/05/04 PHP
Zend Framework入门教程之Zend_Config组件用法详解
2016/12/09 PHP
Prototype使用指南之hash.js
2007/01/10 Javascript
jQuery的强大选择器小结
2009/12/27 Javascript
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
浅析JavaScript中的类型和对象
2013/11/29 Javascript
jquery 判断滚动条到达了底部和顶端的方法
2014/04/02 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
2014/06/15 Javascript
javascript检测flash插件是否被禁用的方法
2016/01/14 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
2016/03/05 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
去除html代码里面的script正则方法
2016/05/19 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
JS获取一个未知DIV高度的方法
2016/08/09 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
基于JavaScript实现简单的音频播放功能
2018/01/07 Javascript
官方推荐react-navigation的具体使用详解
2018/05/08 Javascript
JavaScript使用Math.random()生成简单的验证码
2019/01/21 Javascript
JavaScript函数柯里化实现原理及过程
2020/12/02 Javascript
[00:47]TI7不朽珍藏III——沙王不朽展示
2017/07/15 DOTA
[32:17]完美世界DOTA2联赛循环赛LBZS vs Forest第二场 10月30日
2020/10/31 DOTA
解决Django后台ManyToManyField显示成Object的问题
2019/08/09 Python
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
管理学专业个人求职信范文
2013/09/21 职场文书
法人代表授权委托书
2014/04/08 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
韩语专业职业生涯规划范文:成功之路就在我们脚下
2014/09/11 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
2014年结对帮扶工作总结
2014/12/17 职场文书
大学生党员自我评价
2015/03/04 职场文书
纪检部部长竞选稿
2015/11/21 职场文书
2016年小学生教师节广播稿
2015/12/18 职场文书
退休劳动合同怎么写?
2019/10/25 职场文书