分治算法的经典案例——合并排序
一 算法设计
合并排序是采用分治策略进行排序的算法,是分治算法的一个典型应用和完美体现。它是一种平衡、简单的二分分治策略。
算法步骤如下。
1 分解
将待排序元素分成大小大致相同的两个子序列。
2 治理
对两个子序列进行合并排序。
3 合并
将排好序的有序子序列进行合并,得到最终的有序序列。
二 算法图解
首先将待排序的元素分成大小大致相同的两个子序列,然后把子序列分成大小大致相同的两个子序列,如此下去,直到分解成一个元素为止,这时含有一个元素的子序列就是有序的;然后执行合并操作,将有两个有序的子序列合并为一个有序的序列,如此下去,直到所有元素都合并为一个有序序列时为止。
三 算法详解
1 合并操作
为了进行合并,需要一个合并函数 merge(A,low,mid,high),该函数将排好序的两个子序列A[low,mid]和A[mid+1,high]进行合并。其中,low、high 代表待合并的两个子序列在数组中的下界和上界,mid 代表下界和上界的中间位置,如下图所示。
这里有3个工作指针 i、j、k 和一个辅助数组B。其中 i 和 j 分别指向两个待排序的子序列中当前待比较的元素,k 指向辅助数组 B 中待放置元素的位置。比较 A[i] 和 A[j] ,将较小的赋值给B[k],相应的指针同时向后移动。如此反复,直到所有元素都处理完毕。最后把辅助数组 B 中排好序的元素复制到数组 A 中,如下图所示。
第1次比较时,A[i] = 4, A[j] = 2,将较小的元素 2 放入数组 B 中,j++,k++。
第2次比较时,A[i] = 4, A[j] = 6,将较小的元素 4 放入数组 B 中,i++,k++。
第3次比较时,A[i] = 9, A[j] = 6,将较小的元素 6 放入数组 B 中,j++,k++。
第4次比较时,A[i] = 9, A[j] = 18,将较小的元素 9 放入数组 B 中,i++,k++。
第5次比较时,A[i] = 15, A[j] = 18,将较小的元素 15 放入数组 B 中,i++,k++。
第6次比较时,A[i] = 24, A[j] = 18,将较小的元素 18 放入数组 B 中,j++,k++。
第7次比较时,A[i] = 24, A[j] = 20,将较小的元素 20 放入数组 B 中,j++,k++。
此时,j > high 的后半部分处理完毕,但前半部分还剩余元素,该怎么办?将剩余元素照搬到数组 B 就可以了。
完成合并后,需要把辅助数组 B 中的元素复制到原来数组 A 中。
2 合并排序
将序列分为两个子序列,然后对子序列进行递归排序,再把两个已排好序的子序列合并成一个有序序列。
四 算法实现
归并排序实战_实践求真知-CSDN博客https://blog.csdn.net/chengqiuming/article/details/114706150
分治算法的经典案例——合并排序相关推荐
- AI之NLP:自然语言处理技术简介(是什么/学什么/怎么用)、常用算法、经典案例之详细攻略(建议收藏)
AI之NLP:自然语言处理技术简介(是什么/学什么/怎么用).常用算法.经典案例之详细攻略(建议收藏) 目录 NLP是什么? 1.NLP前置技术解析 2.python中NLP技术相关库 3.NLP案例 ...
- AI之NLP:自然语言处理技术简介(是什么/学什么/怎么用)、常用算法、经典案例之详细攻略(建议收藏)daiding
AI之NLP:自然语言处理技术简介(是什么/学什么/怎么用).常用算法.经典案例之详细攻略(建议收藏) 目录 NLP是什么? 1.NLP前置技术解析 2.python中NLP技术相关库 3.NLP案例 ...
- 排序算法python实现_合并排序算法– Java,C和Python实现
排序算法python实现 Merge sort is one of the most efficient sorting algorithms. It works on the principle o ...
- 排序算法大集锦_合并排序_1(分治思想)
这一系列博客的特点就是--给出每趟排序的结果 本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好,所以这些博客就算是对自己的总结吧. #include <stdio.h& ...
- 数据结构常见算法原理讲解100篇(一)-递归和分治算法原理及案例应用
前言 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以 ...
- 贪心算法的经典案例——最大整数 java实现
题目:设有n个正整数,将它们连接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343,连成的最大整数为34331213. 又如:n=4时,4个整数7,13,4,246,连成的 ...
- 排序中减治法算法伪代码_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)...
在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及建模.今天这篇文章呢,就正式和大家聊一聊 ...
- Java实现合并排序(归并)详细代码
归并排序的思路 归并排序通过不断的将原数组进行拆分(通常拆分成左右两项),一直到剩下一项,然后分别将拆分的子数组进行合并,此时,两个子数组已经是排好序的,所以合并排序只需要进行一趟排序即可完成,所以此 ...
- 快速排序 c++_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)
本文始发于个人公众号:TechFlow 在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及 ...
最新文章
- C++ map 的使用
- 断网,启用网络,关机的实现。
- EasyNVR摄像机网页直播中,推流组件EasyRTMP推送RTMP扩展支持HEVC(H.265)的方案
- More is better
- 一款打包免签分发平台源码+搭建说明
- 关于指针int *p=a和*p=a的纠正
- 来吧,自己动手撸一个分布式ID生成器组件
- Linux下修改TomcatJVM内存大小
- mySQL无锁队列_使用 MySQL 实现无锁任务队列(using MySQL as a job queue)
- P1809 过河问题_NOI导刊2011提高(01)
- 【基础处理】基于matlab GUI语音信号播放【含Matlab源码 946期】
- java 环境win7_java 环境变量 win7
- 济南市建筑物矢量数据(Shp格式+带高度)
- 山西职业技术学院计算机宿舍怎么样,山西职业技术学院宿舍条件、住宿好吗、寝室情况...
- web全栈工程师进阶学习线路图
- baidumap vue 判断范围_vue-baidu-map 行政区域划分
- 完美解决onenote同步速度慢(修改hosts文件)以及如何取得文件修改权限
- 使用Bugly 作为APP异常上报工具
- 用“法外狂徒”理解C++中的引用
- Win10如何用命令打开控制面板
热门文章
- 51nod 1137 矩阵乘法
- windows系统下安装gym运行atari游戏报错:ale_interface/ale_c.dll OSError
- 小米K40(支持wifi 6)不能连上电脑的wifi6热点
- Android Studio IDE安装指南
- 单片机移频防啸叫_移频方式抑制啸叫: _ 扩声技术交流 _ CA001中国音响第一网 _ 最集中的音响人社区_音响|灯光|视频|专业|门户|网站 - Powered by CA001.COM...
- Java并发编程艺术pdf下载(有感情的重排版本)
- GraphicsMagick OpenMP 性能比较(icc+iomp vs gcc+gomp)
- qmake:配置qmake
- 内存泄漏常见场景及处理方法
- 在你的世界里,你是自己的英雄