一 算法设计

合并排序是采用分治策略进行排序的算法,是分治算法的一个典型应用和完美体现。它是一种平衡、简单的二分分治策略。

算法步骤如下。

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

分治算法的经典案例——合并排序相关推荐

  1. AI之NLP:自然语言处理技术简介(是什么/学什么/怎么用)、常用算法、经典案例之详细攻略(建议收藏)

    AI之NLP:自然语言处理技术简介(是什么/学什么/怎么用).常用算法.经典案例之详细攻略(建议收藏) 目录 NLP是什么? 1.NLP前置技术解析 2.python中NLP技术相关库 3.NLP案例 ...

  2. AI之NLP:自然语言处理技术简介(是什么/学什么/怎么用)、常用算法、经典案例之详细攻略(建议收藏)daiding

    AI之NLP:自然语言处理技术简介(是什么/学什么/怎么用).常用算法.经典案例之详细攻略(建议收藏) 目录 NLP是什么? 1.NLP前置技术解析 2.python中NLP技术相关库 3.NLP案例 ...

  3. 排序算法python实现_合并排序算法– Java,C和Python实现

    排序算法python实现 Merge sort is one of the most efficient sorting algorithms. It works on the principle o ...

  4. 排序算法大集锦_合并排序_1(分治思想)

    这一系列博客的特点就是--给出每趟排序的结果 本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好,所以这些博客就算是对自己的总结吧. #include <stdio.h& ...

  5. 数据结构常见算法原理讲解100篇(一)-递归和分治算法原理及案例应用

    前言 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以 ...

  6. 贪心算法的经典案例——最大整数 java实现

    题目:设有n个正整数,将它们连接成一排,组成一个最大的多位整数. 例如:n=3时,3个整数13,312,343,连成的最大整数为34331213. 又如:n=4时,4个整数7,13,4,246,连成的 ...

  7. 排序中减治法算法伪代码_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)...

    在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及建模.今天这篇文章呢,就正式和大家聊一聊 ...

  8. Java实现合并排序(归并)详细代码

    归并排序的思路 归并排序通过不断的将原数组进行拆分(通常拆分成左右两项),一直到剩下一项,然后分别将拆分的子数组进行合并,此时,两个子数组已经是排好序的,所以合并排序只需要进行一趟排序即可完成,所以此 ...

  9. 快速排序 c++_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)

    本文始发于个人公众号:TechFlow 在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及 ...

最新文章

  1. C++ map 的使用
  2. 断网,启用网络,关机的实现。
  3. EasyNVR摄像机网页直播中,推流组件EasyRTMP推送RTMP扩展支持HEVC(H.265)的方案
  4. More is better
  5. 一款打包免签分发平台源码+搭建说明
  6. 关于指针int *p=a和*p=a的纠正
  7. 来吧,自己动手撸一个分布式ID生成器组件
  8. Linux下修改TomcatJVM内存大小
  9. mySQL无锁队列_使用 MySQL 实现无锁任务队列(using MySQL as a job queue)
  10. P1809 过河问题_NOI导刊2011提高(01)
  11. 【基础处理】基于matlab GUI语音信号播放【含Matlab源码 946期】
  12. java 环境win7_java 环境变量 win7
  13. 济南市建筑物矢量数据(Shp格式+带高度)
  14. 山西职业技术学院计算机宿舍怎么样,山西职业技术学院宿舍条件、住宿好吗、寝室情况...
  15. web全栈工程师进阶学习线路图
  16. baidumap vue 判断范围_vue-baidu-map 行政区域划分
  17. 完美解决onenote同步速度慢(修改hosts文件)以及如何取得文件修改权限
  18. 使用Bugly 作为APP异常上报工具
  19. 用“法外狂徒”理解C++中的引用
  20. Win10如何用命令打开控制面板

热门文章

  1. 51nod 1137 矩阵乘法
  2. windows系统下安装gym运行atari游戏报错:ale_interface/ale_c.dll OSError
  3. 小米K40(支持wifi 6)不能连上电脑的wifi6热点
  4. Android Studio IDE安装指南
  5. 单片机移频防啸叫_移频方式抑制啸叫: _ 扩声技术交流 _ CA001中国音响第一网 _ 最集中的音响人社区_音响|灯光|视频|专业|门户|网站 - Powered by CA001.COM...
  6. Java并发编程艺术pdf下载(有感情的重排版本)
  7. GraphicsMagick OpenMP 性能比较(icc+iomp vs gcc+gomp)
  8. qmake:配置qmake
  9. 内存泄漏常见场景及处理方法
  10. 在你的世界里,你是自己的英雄