归并排序(Python)
一.采用分治策略:将原问题划分成n个规模较小的但结构和原问题相同的子问题,递归解决这些子问题后合并各个结果从而得到原问题的解。
二.分治策略的步骤:
- 分解:将原问题分解成一系列子问题
- 解决:子问题粒度足够小、能直接求解则直接求解,子问题不能直接求解则继续递归分解为更小的子问题
- 合并:将子问题的结果合并为原问题的解
总的来说就是递归分解问题至能直接求解,然再将各子问题的结果合并在一起从而得到原问题的解
三.归并排序(以整数排序为例)
3.1将待排序的数组为左右两个组单独排序,然后合并左右两个已排序好的数组,不断递归这个过程知道数组大小为1
3.2伪代码
merge_sort(A, start, end) //A为待排序数组, start和end分别为需要排序的部分的开始和结束的元素下标
if start < end //问题不能直接求解,需要分解
m = (start + end) / 2 //找出中间位置
merge_sort(start, m) //对左半部分排序
merge_sort(m+1, end) //对右半部分排序
merge(A, start, m, end) //合并左右两部分
3.3merge(A, start, m, end)函数
A为数组, start、m和end为开始、中间和结束下标
merge(A, start, m, end)
left_size = m - start
right_size = end - m + 1
L[left_size] = {0}
R[right_size] = {0}
for i = 0 to (left_size -1)
L[i] = A[start+i]
for j = 0 to (right_size -1)
R[j] = A[m + j]
i = 0
j = 0
for n = start to end
if L[i] <= R[j]
A[n] = L[i]
++i
else
A[n] = R[j]
++j
四.Python代码
import sys def merge(A, start, middle, end):
arr_left = A[start : middle + 1]
arr_right = A[middle + 1 : end + 1] i = 0;
j = 0; left_len = len(arr_left)
right_len = len(arr_right) for n in range(start, end + 1):
if arr_left[i] <= arr_right[j]:
A[n] = arr_left[i]
i = i + 1
if i >= left_len: #左边的已经比较完,直接将剩下的右边赋值给A
A[n+1 : n + right_len - j + 1] = arr_right[j : ]
return None
else:
A[n] = arr_right[j]
j = j + 1
if j >= right_len: #右边的已经比较完,直接将剩下的左边赋值给A
A[n+1 : n + left_len - i + 1] = arr_left[i : ]
return None def merge_sort(A, start, end):
if start < end:
middle = (end + start) / 2 merge_sort(A, start, middle)
merge_sort(A, middle + 1, end)
merge(A, start, middle, end) def main(argv=None):
A = [9, 3, 10, 34, 25, 11, 100, 29, 64, 82, 55, 43, 73] print "before : ", A merge_sort(A, 0, len(A) - 1) print "after : ", A if __name__ == "__main__":
sys.exit(main())
运行结果:
归并排序(Python)的更多相关文章
- 归并排序python实现
归并排序python实现 归并排序 归并排序在于把序列拆分再合并起来,使用分治法来实现,这就意味这要构造递归算法 首先是一个例子 原序先通过一半一半的拆分,然后: 然后再一步一步的向上合并,在合并的过 ...
- 归并排序python实现源码
将开发过程经常用到的一些代码片段收藏起来,下面的资料是关于归并排序python实现的代码,应该能对码农们有一些用. def mergesort(arr): if len(arr) == 1: retu ...
- 经典算法之归并排序——python和JS实现
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:韩忠康 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...
- 归并排序-Python实现
归并排序(MergeSort) 归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为 O(n\log n)(大O符号).1945年由约翰·冯·诺 ...
- 归并排序Python 实现
一.归并排序 -归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分合策略(将问题分(divide)成一些小的问题然后递归求解,而合的阶段则将分的阶段得到的各答案&q ...
- 高速排序,归并排序,堆排序python实现
高速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*l ...
- 常见排序算法-Python实现
常见排序算法-Python实现 python 排序 算法 1.二分法 python 32行 right = length- : ] ): test_list = [,,,,,, ...
- python数据结构与算法——归并排序
归并排序: 原理与C语言实现 参考:白话经典算法系列之五 归并排序的实现 1. 容易对有序数组A,B进行排序. 2. 为了使得A,B组内数据有序:可以将A,B组各自再分成二组. 3. 经过不断分组,当 ...
- 你需要知道的九大排序算法【Python实现】之归并排序
四.归并排序 基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列.归并过程:比 ...
随机推荐
- SpringMVC-Interceptor拦截Session登录
背景: 开发的项目都须要账号password登录才干够查看站点的内容,所以我们设计时须要考虑,用户进入站点仅仅能从一个我们设计的规范通道进入即通过注冊的账号password登录,其它方法都是非法的和不 ...
- php后期静态绑定
php后期静态绑定 自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类. 虽然也可以调用非静态方法,但是不会在运行时绑定. static 不再只是简 ...
- js最简单的-点击小图放大
js最简单的-点击小图放大 标签(空格分隔): js <html> <body> <img class="imgview" src="{$v ...
- python中is与==的差别
# is:比较的是两个对象的id值是否相等,# 也就是比较俩对象是否为同一个实例对象,# 是否指向同一个内存地址 # s = "alex"# abc = id(s) # 得到内存地 ...
- Spark RDD概念学习系列之RDD接口
不多说,直接上干货!
- 洛谷P3707 [SDOI2017]相关分析(线段树)
题目描述 Frank对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. Frank不仅喜欢观测,还喜欢分析观测到的数据.他经常分析两个 ...
- Java NIO(六)选择器
前言 Selector选择器是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样使得一个单独的线程可以管理多个Channel,从而管理多个网络连接.选择 ...
- wechat4j开发所有jar包
wechat4j开发所需要的jar包合计,不用你去单独下载,已经全部包括 下载连接 wechat4j-lib.rar 如果你的服务是部署在新浪云计算SAE上的,那么下载这个jar合集 wechat4j ...
- servletconfig和servletcontext学习
servletconfig java.lang.String getInitParameter(java.lang.String name) //根据参数名获取参数值 java.util.Enume ...
- pupload上传插件问题整理
前些日子公司网站需要开发一个类似与百度文库上传文档的功能,实现文档的批量上传.展示以及继续上传的功能.开发完成后,通过在多版浏览器下的使用,发现了一系列问题,特总结于下,以免来者在这些问题上耗费太多时 ...