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异步回调机制实现和使用方法
Nov 26 Python
python执行shell获取硬件参数写入mysql的方法
Dec 29 Python
使用python绘制常用的图表
Aug 27 Python
Python实现基本数据结构中队列的操作方法示例
Dec 04 Python
python如何拆分含有多种分隔符的字符串
Mar 20 Python
关于Tensorflow中的tf.train.batch函数的使用
Apr 24 Python
Python切片索引用法示例
May 15 Python
Python 中导入csv数据的三种方法
Nov 01 Python
python3 爬取图片的实例代码
Nov 06 Python
利用python中集合的唯一性实现去重
Feb 11 Python
使用Nibabel库对nii格式图像的读写操作
Jul 01 Python
Pandas加速代码之避免使用for循环
May 30 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通用分页类page.php[仿google分页]
2008/08/31 PHP
PHP array_flip() 删除重复数组元素专用函数
2010/05/16 PHP
php读取mysql的简单实例
2014/01/15 PHP
PHP根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
零基础php编程好学吗
2019/10/11 PHP
javascript学习笔记(十一) 正则表达式介绍
2012/06/20 Javascript
jQuery中校验时间格式的正则表达式小结
2013/09/22 Javascript
jquery使用jxl插件导出excel示例
2014/04/14 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
2017/07/22 jQuery
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
angularjs 动态从后台获取下拉框的值方法
2018/08/13 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
node.js基础知识汇总
2020/08/25 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
决策树的python实现方法
2014/11/18 Python
Django之choices选项和富文本编辑器的使用详解
2020/04/01 Python
pycharm的python_stubs问题
2020/04/08 Python
keras 多gpu并行运行案例
2020/06/10 Python
实体的生命周期
2013/08/31 面试题
西式婚礼证婚词
2014/01/12 职场文书
学校社会实践活动总结
2014/07/03 职场文书
民警群众路线教育实践活动对照检查材料
2014/10/04 职场文书
司考复习计划
2015/01/19 职场文书
办公室文员岗位职责
2015/02/04 职场文书
公司开除员工通知
2015/04/22 职场文书
学校2015年纠风工作总结
2015/05/15 职场文书
少年雷锋观后感
2015/06/10 职场文书
离职信范文
2015/06/23 职场文书
mysql外连接与内连接查询的不同之处
2021/06/03 MySQL