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开发的小球完全弹性碰撞游戏代码
Oct 15 Python
通过mod_python配置运行在Apache上的Django框架
Jul 22 Python
Python Unittest自动化单元测试框架详解
Apr 04 Python
django中模板的html自动转意方法
May 27 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
Dec 24 Python
在numpy矩阵中令小于0的元素改为0的实例
Jan 26 Python
Python实现字典按key或者value进行排序操作示例【sorted】
May 03 Python
Python异步操作MySQL示例【使用aiomysql】
May 16 Python
python将dict中的unicode打印成中文实例
May 11 Python
python 获取字典特定值对应的键的实现
Sep 29 Python
python3 删除所有自定义变量的操作
Apr 08 Python
Python读写yaml文件
Mar 20 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
php导入模块文件分享
2015/03/17 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
Firefox和IE浏览器兼容JS脚本写法小结
2008/07/07 Javascript
jQuery实现form表单reset按钮重置清空表单功能
2012/12/18 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
js自定义鼠标右键的实现原理及源码
2014/06/23 Javascript
JS获取浏览器语言动态加载JS文件示例代码
2014/10/31 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
jquery实现移动端点击图片查看大图特效
2020/09/11 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
JS使用正则表达式找出最长连续子串长度
2017/10/26 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
JS实现音乐导航特效
2020/01/06 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
TensorFlow高效读取数据的方法示例
2018/02/06 Python
Python实现对文件进行单词划分并去重排序操作示例
2018/07/10 Python
python斐波那契数列的计算方法
2018/09/27 Python
python脚本之一键移动自定格式文件方法实例
2019/09/02 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
如何获取某个日期是当月的最后一天
2013/12/05 面试题
建筑设计学生的自我评价
2014/01/16 职场文书
应聘医药销售自荐书范文
2014/02/08 职场文书
学校清明节活动总结
2014/07/04 职场文书
家长会欢迎词
2015/01/23 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
2015年党小组工作总结
2015/05/26 职场文书