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实现的扫雷游戏实例代码
Aug 01 Python
Python实现抓取百度搜索结果页的网站标题信息
Jan 22 Python
详解python时间模块中的datetime模块
Jan 13 Python
基于Python实现一个简单的银行转账操作
Mar 06 Python
Python3实现发送QQ邮件功能(html)
Dec 15 Python
python定向爬虫校园论坛帖子信息
Jul 23 Python
推荐10款最受Python开发者欢迎的Python IDE
Sep 16 Python
python引入不同文件夹下的自定义模块方法
Oct 27 Python
在PyCharm中批量查找及替换的方法
Jan 20 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 Python
如何通过python计算圆周率PI
Nov 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分页类代码
2013/04/02 PHP
PHP图片处理之图片背景、画布操作
2014/11/19 PHP
php获得网站访问统计信息类Compete API用法实例
2015/04/02 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
php实现的mysqldb读写分离操作类示例
2017/02/07 PHP
PHP微信支付结果通知与回调策略分析
2019/01/10 PHP
简单的前端js+ajax 购物车框架(入门篇)
2011/10/29 Javascript
javascript eval(func())使用示例
2013/12/05 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
javascript实现文字无缝滚动
2016/12/27 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
vue上传图片到oss的方法示例(图片带有删除功能)
2018/09/27 Javascript
小程序实现选择题选择效果
2018/11/04 Javascript
微信小程序学习笔记之函数定义、页面渲染图文详解
2019/03/28 Javascript
vue+Element实现搜索关键字高亮功能
2019/05/28 Javascript
Python中的jquery PyQuery库使用小结
2014/05/13 Python
python在控制台输出进度条的方法
2015/06/20 Python
Python中关于Sequence切片的下标问题详解
2017/06/15 Python
简单学习Python多进程Multiprocessing
2017/08/29 Python
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
Python+PIL实现支付宝AR红包
2018/02/09 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
Python父目录、子目录的相互调用方法
2019/02/16 Python
英国足球店:UK Soccer Shop
2017/11/19 全球购物
印度民族服装购物网站:BIBA
2019/08/05 全球购物
大学生的四年学习自我评价
2013/12/13 职场文书
物流司机岗位职责
2013/12/28 职场文书
酒店副总经理岗位职责范本
2014/02/04 职场文书
绿色环保标语
2014/06/12 职场文书
六查六看剖析材料
2014/10/06 职场文书
运动会宣传稿50字
2015/07/23 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
Vue2.0搭建脚手架
2022/03/13 Vue.js