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 Sleep休眠函数使用简单实例
Feb 02 Python
Python中的面向对象编程详解(下)
Apr 13 Python
Python 含参构造函数实例详解
May 25 Python
Python中enumerate函数代码解析
Oct 31 Python
python 通过字符串调用对象属性或方法的实例讲解
Apr 21 Python
Python魔法方法功能与用法简介
Apr 04 Python
python使用opencv对图像mask处理的方法
Jul 05 Python
Windows系统Python直接调用C++ DLL的方法
Aug 01 Python
Python OpenCV实现鼠标画框效果
Aug 19 Python
解析python的局部变量和全局变量
Aug 15 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
Dec 03 Python
Python 线程池模块之多线程操作代码
May 20 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
浅谈php7的重大新特性
2015/10/23 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
Ajax::prototype 源码解读
2007/01/22 Javascript
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
清除div下面的所有标签的方法
2014/02/17 Javascript
JavaScript中的getTime()方法使用详解
2015/06/10 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
jQuery实现响应鼠标背景变化的动态菜单效果代码
2015/08/27 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
基于jQuery实现响应式圆形图片轮播特效
2015/11/25 Javascript
jQuery实现的纵向下拉菜单实例详解【附demo源码下载】
2016/07/09 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
无法获取隐藏元素宽度和高度的解决方案
2017/03/07 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
2019/12/17 Javascript
微信小程序保存图片到相册权限设置
2020/04/09 Javascript
python验证码识别的实例详解
2016/09/09 Python
python调用虹软2.0第三版的具体使用
2019/02/22 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
python实现随机加减法生成器
2020/02/24 Python
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
医生自荐信
2013/10/11 职场文书
给客户的道歉信
2014/01/13 职场文书
素质拓展感言
2014/01/29 职场文书
土建工程师岗位职责
2014/06/10 职场文书
私用公车造成事故检讨书
2014/11/16 职场文书
超市收银员岗位职责
2015/04/07 职场文书
pytorch MSELoss计算平均的实现方法
2021/05/12 Python
Python中else的三种使用场景
2021/06/16 Python
python自动化八大定位元素讲解
2021/07/09 Python