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 list语法学习(带例子)
Nov 01 Python
python网络编程学习笔记(四):域名系统
Jun 09 Python
Python pickle模块用法实例分析
May 27 Python
查看django版本的方法分享
May 14 Python
浅谈pycharm出现卡顿的解决方法
Dec 03 Python
python中count函数简单用法
Jan 05 Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 Python
python处理写入数据代码讲解
Oct 22 Python
python实现学生通讯录管理系统
Feb 25 Python
Python 如何利用ffmpeg 处理视频素材
Nov 27 Python
详解OpenCV获取高动态范围(HDR)成像
Apr 29 Python
Python 匹配文本并在其上一行追加文本
May 11 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面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
了不起的node.js读书笔记之例程分析
2014/12/22 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
2016/07/20 Javascript
浅谈jquery.form.js的ajaxSubmit和ajaxForm的使用
2016/09/09 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
2017/03/22 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
2017/09/25 Javascript
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
JavaScript实现计算多边形质心的方法示例
2018/01/31 Javascript
Vue源码解析之数组变异的实现
2018/12/04 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
2019/04/22 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
使用JavaScript实现贪吃蛇游戏
2020/09/29 Javascript
Python入门篇之正则表达式
2014/10/20 Python
Python进程间通信用法实例
2015/06/04 Python
在Django中创建第一个静态视图
2015/07/15 Python
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
NetworkX之Prim算法(实例讲解)
2017/12/22 Python
Python使用cx_Freeze库生成msi格式安装文件的方法
2018/07/10 Python
在scrapy中使用phantomJS实现异步爬取的方法
2018/12/17 Python
浅谈Python基础—判断和循环
2019/03/22 Python
anaconda如何查看并管理python环境
2019/07/05 Python
Django模板Templates使用方法详解
2019/07/19 Python
python list多级排序知识点总结
2019/10/23 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
八一建军节活动方案
2014/02/10 职场文书
《他得的红圈圈最多》教学反思
2014/04/24 职场文书
机关中层领导干部群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
公司财务管理制度
2015/08/04 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
vue中利用mqtt服务端实现即时通讯的步骤记录
2021/07/01 Vue.js