python实现归并排序,归并排序的详细分析。

学习归并排序的过程是十分痛苦的。它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的。很多朋友不理解时间复杂度低为什么运行速度不一定快,这个不清楚的伙伴可以看下我之前发表的文章http://www.cnblogs.com/Lin-Yi/p/7301535.html看完之后也许你会对时间复杂度有一个新的认识。

我谈的观点往往不是官方的定义,我希望能帮助更多基础薄弱的同学读懂思想~

归并排序:    先分开再合并,分开成单个元素,合并的时候按照正确顺序合并

假如我们有一个n个数的数列,下标从0到n-1  首先是分开的过程    1 我们按照 n//2 把这个数列分成两个小的数列    2 把两个小数列 再按照新长度的一半 把每个小数列都分成两个更小的    。。。一直这样重复,一直到每一个数分开了    比如:    6 5 4 3 2 1        第一次 n=6 n//2=3 分成      6 5 4      3 2 1        第二次 n=3 n//2=1 分成    6   5 4    3   2 1        第三次 n=1的部分不分了                n=2 n//2=1 分成     5   4      2  1

之后是合并排序的过程:    3 分开之后我们按照最后分开的两个数比较大小形成正确顺序后组合绑定        刚刚举得例子 最后一行最后分开的数排序后绑定   变成     4 5     1 2        排序后倒数第二行相当于把最新分开的数排序之后变成    6   4 5       3    12    4 对每组数据按照上次分开的结果,进行排序后绑定        6 和 4 5(两个数绑定了)  进行排序        3 和 1 2(两个数绑定了)  进行排序        排完后 上述例子第一行待排序的  4 5 6      1 2 3  两组数据    5 对上次分开的两组进行排序        拿着 4 5 6     1 2 3两个数组,进行排序,每次拿出每个数列中第一个(最小的数)比较,把较小的数放入结果数组。再进行下一次排序。        每个数组拿出第一个数,小的那个拿出来放在第一位 1 拿出来了,   变成4 5 6    2 3        每个数组拿出第一个书比较小的那个放在下一个位置  1 2被拿出来,  待排序 4 5 6      2        每个数组拿出第一个书比较小的那个放在下一个位置  1 2 3 被拿出来,  待排序 4 5 6        如果一个数组空了,说明另一个数组一定比排好序的数组最后一个大 追加就可以结果 1 2 3 4 5 6    相当于我们每次拿到两个有序的列表进行合并,分别从两个列表第一个元素比较,把小的拿出来,在拿新的第一个元素比较,把小的拿出来        这样一直到两个列表空了 就按顺序合并了两个列表

结束

时间复杂度: 最好最坏都是 O( n log n )稳定性:稳定缺点:每次拆分数组都要开心的数组, 每次合并数组都要开新数组,空间复杂度很大

在python中这样实现
 1 def merge_sort( li ):
 2     #不断递归调用自己一直到拆分成成单个元素的时候就返回这个元素,不再拆分了
 3     if len(li) == 1:
 4         return li
 5
 6     #取拆分的中间位置
 7     mid = len(li) // 2
 8     #拆分过后左右两侧子串
 9     left = li[:mid]
10     right = li[mid:]
11
12     #对拆分过后的左右再拆分 一直到只有一个元素为止
13     #最后一次递归时候ll和lr都会接到一个元素的列表
14     # 最后一次递归之前的ll和rl会接收到排好序的子序列
15     ll = merge_sort( left )
16     rl =merge_sort( right )
17
18     # 我们对返回的两个拆分结果进行排序后合并再返回正确顺序的子列表
19     # 这里我们调用拎一个函数帮助我们按顺序合并ll和lr
20     return merge(ll , rl)
21
22 #这里接收两个列表
23 def merge( left , right ):
24     # 从两个有顺序的列表里边依次取数据比较后放入result
25     # 每次我们分别拿出两个列表中最小的数比较,把较小的放入result
26     result = []
27     while len(left)>0 and len(right)>0 :
28         #为了保持稳定性,当遇到相等的时候优先把左侧的数放进结果列表,因为left本来也是大数列中比较靠左的
29         if left[0] <= right[0]:
30             result.append( left.pop(0) )
31         else:
32             result.append( right.pop(0) )
33     #while循环出来之后 说明其中一个数组没有数据了,我们把另一个数组添加到结果数组后面
34     result += left
35     result += right
36     return result
37
38 if __name__ == ‘__main__‘:
39     li = [5,4 ,3 ,2 ,1]
40     li2 = merge_sort(li)
41     print(li2)

算法过程理解起来非常痛苦 呜呜!好委屈

不过我希望大家静下心来一点点学,一定会有所收获!

时间: 2024-11-25 03:15:56

python实现归并排序,归并排序的详细分析。的相关文章

python中的归并排序

本来在博客上看到用python写的归并排序的程序,然后自己跟着他写了一下,结果发现是错的,不得不自己操作.而自己对python不是很了解所以就变百度边写,终于在花了半个小时之后就写好了. def merge(a, first, end, temp): if first < end: mid = (first+end)//2 merge(a, first, mid, temp) #前半部分拍好序 merge(a, mid+1, end, temp) #后半部分拍好序 merger(a, first

python try except else finally 执行顺序详细分析

学习python或者其他有异常控制的编程语言, 大家很有可能说try except finally(try catch finally)的执行很简单,无非就是有异常的话执行except, finally无论是否有异常都会执行, 大致上原则是这样, 但是如果涉及到更加详细的复杂的路径,加上return 语句,就没有那么简单了. 1. 没有return 语句的情况 print 'this is a test of code path in try...except...else...finally'

LeetCode::Sort List 详细分析

Sort a linked list in O(n log n) time using constant space complexity. 这道题目非常简短的一句话,给链表排序,看到nlogn,我们可以来简单复习一下排序.首先说一下这个nlogn的时间复杂度(根据决策树我们可以得出这个界限),是基于比较排序的最小上限,也就是说,对于没有一定范围情况的数据来说,最快的排序思路就是归并和快速排序了(当然具体的参数系数还是由更具体的设置决定的).对于数组的话,如果使用归并排序,不是in place的

使用python操作elasticsearch实现数据插入分析

前言: 例行公事,有些人可能不太了解elasticsearch,下面搜了一段,大家瞅一眼. Elasticsearch是一款分布式搜索引擎,支持在大数据环境中进行实时数据分析.它基于Apache Lucene文本搜索引擎,内部功能通过ReST API暴露给外部.除了通过HTTP直接访问Elasticsearch,还可以通过支持Java.JavaScript.Python及更多语言的客户端库来访问.它也支持集成Apache Hadoop环境.Elasticsearch在有些处理海量数据的公司中已经

Eclipse+python的安装与使用(详细阐述了eclipse编写Python程序的基本功能及技巧)

安装环境说明: 操作系统:win7 JDK:jdk1.7.0_11 下载网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html Eclipse:eclipse-jee-kepler-SR2-win32-x86_64 下载网址: http://www.eclipse.org/downloads/ http://www.eclipse.org/downloads/download.php?file=/technolo

使用python中的matplotlib进行绘图分析数据

http://blog.csdn.net/pipisorry/article/details/37742423 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备,并且 Gallery页面 中有上百幅缩略图,打开之后都有源程序.因此如果你需要绘制某种类型的图,只需要在这个页面中浏览/复制/粘贴一下,基本上都能搞定. 在Linux下比较著名的数据图工具

Linux 内核 TCP MSS 机制详细分析

作者:[email protected]知道创宇 404 实验室时间:2019 年 6 月 26 日英文版本:https://paper.seebug.org/967/ 前言 上周Linux内核修复了4个CVE漏洞[1],其中的CVE-2019-11477感觉是一个很厉害的Dos漏洞,不过因为有其他事打断,所以进展的速度比较慢,这期间网上已经有相关的分析文章了.[2][3] 而我在尝试复现CVE-2019-11477漏洞的过程中,在第一步设置MSS的问题上就遇到问题了,无法达到预期效果,但是目前

Linux内核TCP MSS机制详细分析

前言 上周Linux内核修复了4个CVE漏洞[1],其中的CVE-2019-11477感觉是一个很厉害的Dos漏洞,不过因为有其他事打断,所以进展的速度比较慢,这期间网上已经有相关的分析文章了.[2][3] 而我在尝试复现CVE-2019-11477漏洞的过程中,在第一步设置MSS的问题上就遇到问题了,无法达到预期效果,但是目前公开的分析文章却没对该部分内容进行详细分析.所以本文将通过Linux内核源码对TCP的MSS机制进行详细分析. 测试环境 1. 存在漏洞的靶机 操作系统版本:Ubuntu

Python模块的交叉引用问题分析

实际项目中遇到python模块相互引用问题,查资料,说是通过import局部导入的方式可以避免错误,资料如附录所述. 但更改后测试还是会出错,很疑惑!? 如果哪位读者有好的解决方法,敬请留言说明,谢谢. 所以,最好的方法是不进行交叉引用,如果需要就单独分一个模块出来. 附录:Python模块的交叉引用问题解读:How can I have modules that mutually import each other? 有下面两个文件相互引用,Python解释器报错. foo.py: from

10.hibernate缓存机制详细分析(转自xiaoluo501395377)

hibernate缓存机制详细分析 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相信看完的朋友绝对能对hibernate的 N+1问题以及缓存有更深的了解. 一.N+1问题 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N+1问题: list()获得对象: 1 /** 2 * 此时会发出一条sql,将30个学生全部查询出来