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的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
Jun 14 Python
使用python实现BLAST
Feb 12 Python
python 实现登录网页的操作方法
May 11 Python
python中cPickle类使用方法详解
Aug 27 Python
Python selenium使用autoIT上传附件过程详解
May 26 Python
Python基于os.environ从windows获取环境变量
Jun 09 Python
浅谈优化Django ORM中的性能问题
Jul 09 Python
python爬取网易云音乐热歌榜实例代码
Aug 07 Python
Python使用xpath实现图片爬取
Sep 16 Python
python的setattr函数实例用法
Dec 16 Python
Django实现聊天机器人
May 31 Python
教你使用Python获取QQ音乐某个歌手的歌单
Apr 03 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
世界上第一台立体声收音机
2021/03/01 无线电
用IE远程创建Mysql数据库的简易程序
2006/10/09 PHP
简单PHP上传图片、删除图片实现代码
2010/05/12 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
window.opener用法和用途实例介绍
2013/08/19 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
实例详解JavaScript获取链接参数的方法
2016/01/01 Javascript
使用Web Uploader实现多文件上传
2016/06/08 Javascript
AngularJS基础 ng-keyup 指令简单示例
2016/08/02 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
JavaScript面试开发常用的知识点总结
2016/08/08 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
2019/07/19 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
Python程序中使用SQLAlchemy时出现乱码的解决方案
2015/04/24 Python
Python学习之Django的管理界面代码示例
2018/02/10 Python
Python+selenium 获取一组元素属性值的实例
2018/06/22 Python
Flask框架WTForm表单用法示例
2018/07/20 Python
python 阶乘累加和的实例
2019/02/01 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
2019/08/09 Python
用python对oracle进行简单性能测试
2020/12/05 Python
基于HTML5新特性Mutation Observer实现编辑器的撤销和回退操作
2016/01/11 HTML / CSS
局域网标准
2016/09/10 面试题
公司活动策划方案
2014/01/13 职场文书
《欢乐的泼水节》教学反思
2014/04/22 职场文书
建筑工程技术专业求职信
2014/07/16 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
大学生入党自荐书
2015/03/05 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python
sql注入教程之类型以及提交注入
2021/08/02 MySQL