python 归并排序的实现
一、归并排序
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之),将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序,若将两个有序表合并成一个有序表,称为二路归并。
二、归并排序的基本思想
将待排序序列R[0…n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列
三、归并排序的算法描述
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾,将另一序列剩下的所有元素直接复制到合并序列尾
归并排序其实要做两件事:
(1)“分解”——将序列每次折半划分(递归实现)
(2)“合并”——将划分后的序列段两两合并后排序
如何合并?
在每次合并过程中,都是对两个有序的序列段进行合并,然后排序。
这两个有序序列段分别为 R[low, mid] 和 R[mid+1, high]。
先将他们合并到一个局部的暂存数组R2中,带合并完成后再将R2复制回R中。
我们称 R[low, mid] 第一段,R[mid+1, high] 为第二段。
每次从两个段中取出一个记录进行关键字的比较,将较小者放入R2中,最后将各段中余下的部分直接复制到R2中。
经过这样的过程,R2已经是一个有序的序列,再将其复制回R中,一次合并排序就完成了。
四、代码实现过程(python)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | def merge_sort(arr): if len (arr) > 1 : mid = len (arr) / / 2 # 找到中间索引 L = arr[:mid] # 左半部分 R = arr[mid:] # 右半部分 merge_sort(L) # 递归地排序左半部分 merge_sort(R) # 递归地排序右半部分 # 合并两个有序数组 i = j = k = 0 # 复制数据到临时数组L[] while i < len (L) and j < len (R): if L[i] < R[j]: arr[k] = L[i] i + = 1 else : arr[k] = R[j] j + = 1 k + = 1 # 复制左半部分剩余的数据 while i < len (L): arr[k] = L[i] i + = 1 k + = 1 # 复制右半部分剩余的数据 while j < len (R): arr[k] = R[j] j + = 1 k + = 1 # 测试代码 arr = [ 12 , 11 , 13 , 5 , 6 , 7 ] print ( "未排序的数组:" , arr) merge_sort(arr) print ( "排序后的数组:" , arr) |
这个例子中,merge_sort函数首先找到数组的中间索引,然后将数组分为两部分,递归地对这两部分进行排序。最后,使用一个循环将排序后的两个数组合并为一个有序数组。
到此这篇关于python 归并排序的文章就介绍到这了,更多相关python 归并排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
python利用 pytesseract快速识别提取图片中的文字((图片识别)
本文介绍了tesseract的python调用,也就是pytesseract库,其中还有一些其他的内容并没有涉及,仅涉及到了图片提取文字,如果你对其感兴趣,可以深入探索一下,也希望能和我探讨一下2022-11-11python opencv 图像处理之图像算数运算及修改颜色空间
这篇文章主要介绍了python opencv 图像处理之图像算数运算及修改颜色空间,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下2022-08-08python中数组array和列表list的基本用法及区别解析
大家都知道数组array是同类型数据的有限集合,列表list是一系列按特定顺序排列的元素组成,可以将任何数据放入列表,且其中元素之间没有任何关系,本文介绍python中数组array和列表list的基本用法及区别,感兴趣的朋友一起看看吧2022-05-05
最新评论