—————  第二天  —————

————————————

举个例子,有A、B、C、D、E、F、G、H一共8个武术家参考参加比武大会。

第一轮,两两一组,有4名选手胜出(四分之一决赛)

第二轮,两两一组,有两名选手胜出(半决赛)

第三轮,仅剩的两人一组,冠军胜出(总决赛)

归并排序和擂台赛,有什么相同和不同之处呢?让我们以下面这个数组来举例说明:

归并排序就像是组织一场元素之间的“比武大会”,这场比武大会分成两个阶段:

1.分组

假设集合一共有n个元素,算法将会对集合进行逐层的折半分组。

第一层分成两个大组,每组n/2个元素;

第二层分成4个小组,每组n/4个元素;

第三层分成8个更小的组,每组n/8个元素;

......

一直到每组只有一个元素为止。

这样一来,整个数组就分成了一个个小小的“擂台”。

2.归并

既然分了组,接下来就要开始“比武”了。

归并排序和擂台赛有一个很大的不同,就是擂台赛只需要决定谁是老大,而并不关心谁做老二和老三;归并排序的要求复杂一些,需要确定每一个元素的排列位置。

因此,当每个小组内部比较出先后顺序以后,小组之间会展开进一步的比较和排序,合并成一个大组;大组之间继续比较和排序,再合并成更大的组......最终,所有元素合并成了一个有序的集合。

这个比较与合并的过程叫做归并,对应英文单词merge,这正是归并排序名字的由来。

归并操作需要哪三个步骤呢?我们以两个长度为4的集合为例:

第一步,创建一个额外大集合用于存储归并结果,长度是两个小集合之和。(p1,p2,p是三个辅助指针,用于记录当前操作的位置)

第二步,从左到右逐一比较两个小集合中的元素,把较小的元素优先放入大集合。

由于1<2,所以把元素1放入大集合,p1和p各右移一位:

由于2<3,所以把元素2放入大集合,p2和p各右移一位:

由于3<7,所以把元素3放入大集合,p1和p各右移一位:

由于5<7,所以把元素5放入大集合,p1和p各右移一位:

由于6<7,所以把元素6放入大集合,p1和p各右移一位:

此时左侧的小集合已经没有元素可用了。

第三步,从另一个还有剩余元素的集合中,把剩余元素按顺序复制到大集合尾部。

这样一来,两个有序的小集合就归并成了一个有序的大集合。

static public void mergeSort(int[] array, int start, int end){if(start < end){//折半成两个小集合,分别进行递归int mid=(start+end)/2;mergeSort(array, start, mid);mergeSort(array, mid+1, end);//把两个有序小集合,归并成一个大集合merge(array, start, mid, end);}
}
static private void merge(int[] array, int start, int mid, int end){//开辟额外大集合,设置指针int[] tempArray = new int[end-start+1];int p1=start, p2=mid+1, p=0;//比较两个小集合的元素,依次放入大集合while(p1<=mid && p2<=end){if(array[p1]<=array[p2])tempArray[p++]=array[p1++];elsetempArray[p++]=array[p2++];}//左侧小集合还有剩余,依次放入大集合尾部while(p1<=mid)tempArray[p++]=array[p1++];//右侧小集合还有剩余,依次放入大集合尾部while(p2<=end)tempArray[p++]=array[p2++];//把大集合的元素复制回原数组for (int i=0; i<tempArray.length; i++)array[i+start]=tempArray[i];
}
public static void main(String[] args) {int[] array = { 5, 8, 6, 3, 9, 2, 1, 7 };mergeSort(array, 0, array.length-1);System.out.println(Arrays.toString(array));
}

—————END—————

关注下方二维码,订阅更多精彩内容

 朕已阅

漫画:什么是归并排序?相关推荐

  1. 漫画:史上最生动的「归并排序」

    那我们借用 cs50 里的例子,比如要把一摞卷子排好序,那用并归排序的思想是怎么做的呢? 首先把一摞卷子分成两摞: 把每一摞排好序: 把排好序的两摞再合并起来. 感觉啥都没说? 那是因为上面的过程里省 ...

  2. 【算法入门漫画】:“排序算法” 大总结

    冒泡排序: 漫画:什么是冒泡排序? 选择排序: 漫画:什么是选择排序? 插入排序: 漫画:什么是插入排序? 此外还有冒泡排序的变种,鸡尾酒排序: 漫画:什么是鸡尾酒排序? 第三梯队的排序算法有什么共同 ...

  3. c++ 二维数组 排序_漫画:“排序算法” 大总结

    ​冒泡排序: 漫画:什么是冒泡排序?​mp.weixin.qq.com 选择排序: 漫画:什么是选择排序?​mp.weixin.qq.com 插入排序: 漫画:什么是插入排序?​mp.weixin.q ...

  4. 漫画:什么是旅行商问题?

    需要规划出怎样的路线呢?举个例子: 有一个快递员,要分别给三家顾客送快递,他自己到达每个顾客家的路程各不相同,每个顾客之间的路程也各不相同. 那么,想要把快递依次送达这三家,并最终回到起点,哪一条路线 ...

  5. 漫画算法-学习笔记(17)

    漫画算法-小灰的算法之旅(17) 文章目录 漫画算法-小灰的算法之旅(17) 1. 什么是桶排序 实现步骤 代码实现 总结 1. 什么是桶排序 桶排序: 是一种线性时间的排序算法,类似于计数排序所创建 ...

  6. 漫画算法-小灰的算法之旅-排序算法(四)

    本文内容基于<漫画算法 小灰的算法之旅>,魏梦舒著. 1. 分类 1.1 时间复杂度为O(n^2)的排序算法 1.2 时间复杂度为O(nlogn)的排序算法 1.3 时间复杂度为线性的排序 ...

  7. 《漫画算法》读书心得笔记-未完

    感谢FunTester送的书籍.建议大家买或借来看看,一起学习下.本文主要是记录我看这本书的心得,不一定理解是对的,是我自己悟出来的体会,而不是按书照抄,都是凭自己的理解写出来的,相当于在写一本书了, ...

  8. 齐姐漫画:排序算法(二)

    归并排序 那我们借用 cs50 里的例子,比如要把一摞卷子排好序,那用并归排序的思想是怎么做的呢? 首先把一摞卷子分成两摞: 把每一摞排好序: 把排好序的两摞再合并起来. 感觉啥都没说? 那是因为上面 ...

  9. 漫画:什么是选择排序?

    选择排序是一种简单直观的算法,今天我们聊聊选择排序的思想,代码以及复杂度 排序思想 一天,小一尘和师傅下山去了,在集市中路经一个水果摊,只见水果摊上摆着色泽基本相同但大小不一的苹果 师傅答应后,小一尘 ...

最新文章

  1. ThinkPHP入门
  2. C语言 数组排序 – 快速法排序 - C语言零基础入门教程
  3. java实现多线程抢单_JAVA实现多线程的四种方式
  4. 我的内核学习笔记7:Intel LPC驱动lpc_ich分析
  5. JSP中include指令和include动作的区别
  6. 对比jQuery和AngularJS的不同思维模式
  7. python实现自动登录网页用户名密码_Python使用selenium实现网页用户名 密码 验证码自动登录功能...
  8. MySQL入门(详细总结)
  9. Python实现图形学DDA算法
  10. Feem(局域网文件传输工具)官方版
  11. 2022 年要了解的新兴安全供应商
  12. 使用Arduino解码并发送433MHz RF无线射频信号
  13. 〖Python WEB 自动化测试实战篇⑧〗- 实战 - 利用 selenium 处理弹出框
  14. vs = VirtualService
  15. violate原理和用法
  16. 自己写的C盘清理工具 Ver1.0.0
  17. (Fabric 学习三)Fabric2.2 多机部署 使用fabcar链码
  18. 编解码标准-H.264
  19. 解决Mac连接RIOCH(理光)打印机无法打印问题
  20. 第一颗国产 单/双端口 MIPI CSI/DSI 至 HDMI 1.4 发射器 芯片LT9611

热门文章

  1. c#简单类的继承【C#】
  2. PHPStudy下Apache SSL证书安装教程 1
  3. 怎样在fastboot 里面加入新的命令
  4. Codis 分布式缓存部署
  5. win2003服务器 虚拟主机安全配置
  6. 2010年终人生的思考
  7. android studio生成签名导打包的方法
  8. Spring配置项context:annotation-config/解释说明
  9. 科普dip,dp,sp,dpi,ppi,px,Density
  10. linux packet socket,linux Packet socket (1)简单介绍