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 11 Python
Python中__init__和__new__的区别详解
Jul 09 Python
python控制台中实现进度条功能
Nov 10 Python
python实现class对象转换成json/字典的方法
Mar 11 Python
Python3使用turtle绘制超立方体图形示例
Jun 19 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
python对html过滤处理的方法
Oct 21 Python
Python 获取windows桌面路径的5种方法小结
Jul 15 Python
PIL图像处理模块paste方法简单使用详解
Jul 17 Python
详解Python可视化神器Yellowbrick使用
Nov 11 Python
在django项目中导出数据到excel文件并实现下载的功能
Mar 13 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
Jun 18 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
解析csv数据导入mysql的方法
2013/07/01 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
PHP MYSQL简易交互式站点开发
2016/12/27 PHP
PHP实现的MD5结合RSA签名算法实例
2017/10/07 PHP
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
2016/05/12 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
domReady的实现案例
2016/11/23 Javascript
微信小程序wx:for和wx:for-item的用法详解
2018/04/01 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
2019/01/08 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
vue2配置scss的方法步骤
2019/06/06 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
Python实现的数据结构与算法之快速排序详解
2015/04/22 Python
python学习之编写查询ip程序
2016/02/27 Python
python先序遍历二叉树问题
2017/11/10 Python
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
Python tkinter常用操作代码实例
2020/01/03 Python
浅析python标准库中的glob
2020/03/13 Python
python,Java,JavaScript实现indexOf
2020/09/09 Python
python中pyqtgraph知识点总结
2021/01/26 Python
美国著名的家居用品购物网站:Bed Bath & Beyond
2018/01/05 全球购物
世界经理人咨询有限公司面试
2014/09/23 面试题
如何选择使用结构还是类
2014/05/30 面试题
餐饮采购员岗位职责
2014/03/15 职场文书
小学老师寄语大全
2014/04/04 职场文书
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android
windows11怎么查看wifi密码? win11查看wifi密码的技巧
2021/11/21 数码科技
剖析后OpLog订阅MongoDB的数据变更就没那么难了
2022/02/24 MongoDB