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 相关文章推荐
PyQt5每天必学之QSplitter实现窗口分隔
Apr 19 Python
对Python 文件夹遍历和文件查找的实例讲解
Apr 26 Python
Python 读取指定文件夹下的所有图像方法
Apr 27 Python
python实现合并两个排序的链表
Mar 03 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
Aug 09 Python
python 解决print数组/矩阵无法完整输出的问题
Feb 19 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
Feb 26 Python
基于python纯函数实现井字棋游戏
May 27 Python
python多线程和多进程关系详解
Dec 14 Python
如何用用Python将地址标记在地图上
Feb 07 Python
安装不同版本的tensorflow与models方法实现
Feb 20 Python
python 中的jieba分词库
Nov 23 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中的日期及时间
2006/11/23 PHP
PHP的时间戳与具体时间转化的简单实现
2016/06/13 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
Jquery AJAX 框架的使用方法
2009/11/03 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
nodejs实现发出蜂鸣声音(系统报警声)的方法
2017/01/18 NodeJs
Vue2 Vue-cli中使用Typescript的配置详解
2017/07/24 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
详解一个基于react+webpack的多页面应用配置
2019/01/21 Javascript
[52:32]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第三场 11.18
2020/11/18 DOTA
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
python实现简易动态时钟
2018/11/19 Python
python读取大文件越来越慢的原因与解决
2019/08/08 Python
python脚本执行CMD命令并返回结果的例子
2019/08/14 Python
Python pip安装模块提示错误解决方案
2020/05/22 Python
Python reques接口测试框架实现代码
2020/07/28 Python
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
Vans(范斯)新西兰官方网站:美国原创极限运动品牌
2020/09/19 全球购物
初二政治教学反思
2014/01/12 职场文书
高中军训的心得体会
2014/09/01 职场文书
交通安全横幅标语
2014/10/07 职场文书
办公用房租赁协议书
2014/11/29 职场文书
离婚起诉书范文2015
2015/05/19 职场文书
高二语文教学反思
2016/02/16 职场文书
python实战之用emoji表情生成文字
2021/05/08 Python
Javascript之datagrid查询详解
2021/09/15 Javascript
B站评分公认最好看的动漫,你的名字评分9.9,第六备受喜欢
2022/03/18 日漫