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数据结构之Array用法实例
Oct 09 Python
Python实现对比不同字体中的同一字符的显示效果
Apr 23 Python
python中关于for循环的碎碎念
Jun 30 Python
python实现kNN算法
Dec 20 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
Feb 18 Python
IntelliJ IDEA安装运行python插件方法
Dec 10 Python
python3编写ThinkPHP命令执行Getshell的方法
Feb 26 Python
TensorFlow通过文件名/文件夹名获取标签,并加入队列的实现
Feb 17 Python
Python timeit模块原理及使用方法
Oct 10 Python
python3.8.3安装教程及环境配置的详细教程(64-bit)
Nov 28 Python
解决numpy数组互换两行及赋值的问题
Apr 17 Python
python代码实现扫码关注公众号登录的实战
Nov 01 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实现MySQL更新记录的代码
2008/06/07 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
2013/06/26 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
移动设备web开发首选框架:zeptojs介绍
2015/01/29 Javascript
JS获取iframe中longdesc属性的方法
2015/04/01 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
2016/01/18 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
微信小程序 scroll-view组件实现列表页实例代码
2016/12/14 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
新版小程序登录授权的方法
2018/12/12 Javascript
生产制造追溯系统之在线打印功能
2019/06/03 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
python实现保存网页到本地示例
2014/03/16 Python
Python简单日志处理类分享
2015/02/14 Python
对于Python中线程问题的简单讲解
2015/04/03 Python
Python计算字符宽度的方法
2016/06/14 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
python实现俄罗斯方块游戏
2020/03/25 Python
对python数据切割归并算法的实例讲解
2018/12/12 Python
python使用Plotly绘图工具绘制气泡图
2019/04/01 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
如何基于Python代码实现高精度免费OCR工具
2020/06/18 Python
Python如何读取、写入CSV数据
2020/07/28 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
中专毕业自我鉴定
2013/10/16 职场文书
项目建议书范文
2014/05/12 职场文书
集中采购方案
2014/06/10 职场文书
毕业生找工作求职信
2014/08/05 职场文书
离婚起诉状范本
2015/05/19 职场文书
2019秋季运动会口号
2019/06/25 职场文书