排序算法(二):归并排序
来源:互联网 发布:写作文网络词语 编辑:程序博客网 时间:2024/05/29 17:45
归并排序(MergeSort)是大神冯诺依曼研发的一款高效且稳定的排序算法,据资料显示,Python自带排序函数用的就是归并排序。其稳定性和效率肯定是毋庸置疑的了,学好归并排序非常有用,是多路归并排序的功底课(多路归并排序在海量数据环境下内存不足是非常有用)。
时间复杂度:O(n*logn)
空间复杂度:O(n)
下面我讲解一下归并排序的排序流程:
给定一个列表,里面有许多待排序的数,诸如:L=[35, 24,16,28,20,4,32,10],我对这个L进行归并排序:
1.首先读者要了解的是,归并排序使用的是分治的递归思想(将问题分成差不多相等的两块,分而治之,将较大的问题转换成较小的问题,有助于减小时间复杂度)。那么我们先将原问题分为L_l=[35,24,16,28]和L_r=[20,4,32,10]两个部分,随后左右两个部分继续分,直到分成一个数为止。
2.“分”的阶段结束了,下面是合,合的话调用另一个Merge函数就行了,这个函数的作用是将L_l和L_r进行排序合并在一起。Merge函数首先放置两个标志位i和j,i和j分别在L_l与L_r的第一个位置。这时比较L_l[i]与L_r[j]的大小,把较小的一个放进r[]这个排完序的列表中,然后i++或者j++,然后重复该循环,循环的终止条件是:L_l[i]与L_r[j]其中任意一个全进到r[]中了,就将另一个从做到右一次append进r[]中。
排序模拟:
1. L=[(24,35),(16,28),(4,20),(10,32)]
2. L=[(16,24,28,35),(4,10,20,32)]
3. L=[4,10,16,20,24,28,32,35]
Python源码:
def MergeSort(list): if len(list) == 1: return list else: list_left = MergeSort(list[0:len(list)/2]) list_right = MergeSort(list[len(list)/2 : len(list)]) return Merge(list_left, list_right)def Merge(list_left, list_right): # i为list_left的第一个元素 # j为list_right的第一个元素 # 列表r是list_left和list_right排完序的列表 r = [] i = j = 0 lenth_l = len(list_left) lenth_r = len(list_right) while i<lenth_l and j<lenth_r: if list_left[i] <= list_right[j]: r.append(list_left[i]) i += 1 else: r.append(list_right[j]) j += 1 if i==lenth_l: for n in range(j, lenth_r): r.append(list_right[n]) else: # j==lenth_r for n in range (i, lenth_l): r.append(list_left[n]) return r
与系统MergeSort性能对比:
可以看到虽然与系统排序性能仍然有很大的距离,但是相比快速排序效率竟然提高了,不知道是为什么。。。
- 排序算法(二)-- 归并排序
- 排序算法(二):归并排序
- 算法学习(排序二)归并排序
- 排序算法二(归并排序、快速排序、希尔排序)
- 算法系列(二) 归并排序
- 排序算法总结(二)归并法
- 二路归并排序算法
- 二路归并排序算法
- 二路归并排序算法
- (二)归并排序
- 归并排序(二)
- Erlang的算法-(二)合并排序/归并排序
- 排序算法(二)—归并排序(Merge sort)
- array和list排序算法对比(二):归并排序
- 排序算法集合(二)归并排序精讲
- JAVA实现排序算法(二):两种归并排序
- 排序算法之二路归并排序
- 排序算法二之快速 归并排序
- 初见WCF
- Spring源码导入Eclipse图文教程
- linux windows Tomcat内存优化
- WCF之 契约
- 跨浏览器按钮兼容+封装浏览器的按键
- 排序算法(二):归并排序
- ARMv8 内存管理架构.学习笔记
- 程序员选择公司的8个标准!
- jQuery第一天 hide()函数
- android 一些易混淆的方法1
- 浏览器兼容字符编码
- iOS中OpenGL应用
- JS入门之arguments对象
- Interpreter(解释器)设计模式