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 相关文章推荐
Windows下安装python2.7及科学计算套装
Mar 05 Python
Python实现文件按照日期命名的方法
Jul 09 Python
python 环境变量和import模块导入方法(详解)
Jul 11 Python
python Pygame的具体使用讲解
Nov 03 Python
python字符串string的内置方法实例详解
May 14 Python
Python利用Django如何写restful api接口详解
Jun 08 Python
Python并行分布式框架Celery详解
Oct 15 Python
Python Excel处理库openpyxl使用详解
May 09 Python
Django 中自定义 Admin 样式与功能的实现方法
Jul 04 Python
Python监听剪切板实现方法代码实例
Nov 11 Python
python+appium+yaml移动端自动化测试框架实现详解
Nov 24 Python
python状态机transitions库详解
Jun 02 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
手把手教你使用DedeCms V3的在线采集图文教程
2007/04/03 PHP
php自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
浅谈php函数serialize()与unserialize()的使用方法
2014/08/19 PHP
php集成动态口令认证
2016/07/21 PHP
PHP 常用时间函数资料整理
2016/10/22 PHP
TP5多入口设置实例讲解
2020/12/15 PHP
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
JavaScript中的一些定位属性[图解]
2010/07/14 Javascript
jQuery创建插件的代码分析
2011/04/14 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
简化版手机端照片预览组件
2015/04/13 Javascript
AngularJS使用指令增强标准表单元素功能
2016/07/01 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
Vue.js中数据绑定的语法教程
2017/06/02 Javascript
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
2017/12/29 Javascript
swiper 自动图片无限轮播实现代码
2018/05/21 Javascript
Angular4 Select选择改变事件的方法
2018/10/09 Javascript
微信小程序商品详情页底部弹出框
2019/11/22 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
vue实现自定义多选按钮
2020/07/16 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
python的else子句使用指南
2016/02/27 Python
python lxml中etree的简单应用
2019/05/10 Python
python ubplot使用方法解析
2020/01/10 Python
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
可以使用抽象函数重写基类中的虚函数吗
2013/06/02 面试题
测绘工程本科生求职信
2013/10/10 职场文书
学期研究性学习个人的自我评价
2014/01/09 职场文书
法律进学校实施方案
2014/03/15 职场文书
工程部部长岗位职责
2015/02/12 职场文书
消防演习通知
2015/04/25 职场文书