【Java】归并排序
代码:
1 public static void mergeSort(int[] arr) {
2 if (arr == null || arr.length < 2) {
3 return;
4 }
5 mergeSort(arr, 0, arr.length - 1);
6 }
7
8 public static void mergeSort(int[] arr, int l, int r) {
9 if (l == r) {
10 return;
11 }
12 int mid = l + ((r - l) >> 1);
13 mergeSort(arr, l, mid); //左侧有序
14 mergeSort(arr, mid + 1, r); //右侧有序
15 merge(arr, l, mid, r); //merge
16 }
17
18 public static void merge(int[] arr, int l, int m, int r) {
19 int[] help = new int[r - l + 1];
20 int i = 0;
21 int p1 = l;
22 int p2 = m + 1;
23 while (p1 <= m && p2 <= r) {
24 help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++]; //谁小拷贝谁(p1和p2都不越界)
25 }
26 while (p1 <= m) {
27 help[i++] = arr[p1++];
28 }
29 while (p2 <= r) {
30 help[i++] = arr[p2++];
31 }
32 for (i = 0; i < help.length; i++) {
33 arr[l + i] = help[i];
34 }
35 }
如果看代码的流程,归并排序的是把一组数据,一分为二,之后对左边的数据继续一分为二,分到实在不能再分(也就是l == r的时候)
最后再排序!这其实是分而治之的思想,假设有5个数【2,4,9,6,3】我们直接排序不好排,但是如果我们分一下呢?
变成【2,4】和【9,6,3】如果对左边再分一次呢?
【2】、【4】这时候2 和 4 都是单独的一个数,我们显然知道单独的一个数是最好排序的,2 和4 本身就是有序的,因为它们只有自己!
对于左边,当分到不能再分的时候return;,递归调用的“递”的过程就完成了,接下来就是归了。
在归的过程中,会多次进入右侧的递归函数,但是由于 l == r 所以实质上右侧的调用是无效的,只需要调用merge函数完成左侧单个数据
的依次排序!
当左侧完成的时候,会进入最初始的那个 l 和 r 的值,接下来再次进入右侧的递归函数,完成同样的一个过程,最后左侧数据和右侧数据
都是各自有序的,当程序跳出(mergeSort(arr, mid + 1, r); //右侧有序)这一行代码的时候,会执行最外层函数的最后一次merge,这时候
对所有数据完成最后一次排序参数应该是最初的参数,也就是 l = 0 ; mid = 2 ; r = 4 ! merge(0,2.4) 这时候所有数据就都是有序的了!
代码的执行顺序?
当进入一条递归语句的时候,会多次循环整个过程,只有当满足结束条件的时候,才会return!
但此时要注意,这时候return只是退出了这一条语句而已,对于最外层的函数来说,只是这一条
语句执行完毕了。还是需要继续往下执行的,也就是会进入下一条递归语句,对于归并排序来说
先进入左边递归,左边有序,之后进入右边递归,右边有序!最后进入最外层的函数执行最后一
条merge语句,把整个数组完成排序!
下面是我画的一个草图:


该图片来自:https://www.cnblogs.com/l199616j/p/10604351.html
【Java】归并排序的更多相关文章
- java归并排序,单线程vs多线程
一.什么是归并排序 归并排序又称合并排序,它是成功应用分治技术的一个完美例子.对于一个需要排序的数组A[0..n-1],归并排序把它一分为二:A[0..n/2-1]和A[n/2..n-1],并对每个子 ...
- java归并排序
代码如下: public class MergeSort { public static void mergeSort(DataWrap [] data) { sort(data , 0 , data ...
- java归并排序详解
归并排序 /** * 归并排序 * 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列 * 时间 ...
- Java归并排序的递归与非递归实现
该命题已有无数解释,备份修改后的代码 平均时间复杂度: O(NLogN) 以2为底 最好情况时间复杂度: O(NLogN) 最差情况时间复杂度: O(NLogN) 所需要额外空间: 递归:O(N + ...
- 23. Merge K Sorted Lists (Java, 归并排序的思路)
题目:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity ...
- 8 Java 归并排序(MergerSort)
图片素材与文字描述来自:尚硅谷-韩顺平数据结构与算法. 1.基本思想 归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divi ...
- Java 归并排序
package cookie; public class MergeSort { void mergeSort(int[] a, int[] temp, int left, int right) { ...
- Hark的数据结构与算法练习之归并排序
算法说明: 归并排序的思路就是分而治之,将数组中的数字递归折半进行排序. 递归到最底层就只剩下有两个数字进行比较,再从底层往下进行排序合并.最终得出结果. 同样,语言描述可能对于不知道这个算法的人来说 ...
- Java数据结构和算法 - 递归
三角数字 Q: 什么是三角数字? A: 据说一群在毕达哥拉斯领导下工作的古希腊的数学家,发现了在数学序列1,3,6,10,15,21,……中有一种奇特的联系.这个数列中的第N项是由第N-1项加N得到的 ...
- 20172328 2018-2019《Java软件结构与数据结构》第五周学习总结
20172328 2018-2019<Java软件结构与数据结构>第五周学习总结 概述 Generalization 本周学习了第九章:排序与查找,主要包括线性查找和二分查找算法和几种排序 ...
随机推荐
- AIGC程序员效能提升之道
得益于IT产业近几年的繁荣,老杨所在公司的业务也出奇的兴隆,每天干不完的工作背后,也意味着健康的消耗和体重的不断增加. 曾记否,刚毕业的老杨体重刚刚堪堪破百,同事们经常调侃他说是一阵风就能吹走,经过了 ...
- 多线程系列(八) -ReentrantLock基本用法介绍
一.简介 在之前的线程系列文章中,我们介绍到了使用synchronized关键字可以实现线程同步安全的效果,以及采用wait().notify()和notifyAll()方法,可以实现多个线程之间的通 ...
- 好用的OCR文本识别工具
之所以会用到OCR工具,是因为在看一些扫描版的PDF文档时,有时候需要复制粘贴一些文字,特别是技术性文档,对于一些命令或者代码片段需要复制出来执行验证. 网络上有许多推荐OCR工具的文章,但是大多数都 ...
- 最新最简单安装龙蜥操作系统centos8
下载 https://openanolis.cn/download 我用的是稳定版本 Anolis OS8.2QU1 安装(vm用的15.5pro) 关键点 进去后,输入命令 ip a // 查看ip ...
- vue upload 图片转base64、转二进制数组,保存编码数据到文件
功能需求 1.图片转base64 2.base 64 转二进制数组 3.保存二进制数据到文件下载到本地 解决方法 问题1: 参考资料 vue element upload图片 转换成base64 具体 ...
- Vue源码学习(十一):计算属性computed初步学习
好家伙, 1.Computed实现原理 if (opts.computed) { initComputed(vm,opts.computed); } function initComputed(v ...
- 简单封装 Flurl
FlurlHttpClient类 public class FlurlHttpClient { private readonly FlurlClient client; public FlurlHtt ...
- Jmeter json断言的使用
1 添加方式:取样器右键->添加->断言->JSON断言 作用:使用JSON表达式提取实际数据与预期进行比较 2首先我们来了解下断言组件的各个功能: Asset JSON Pat ...
- Java //在150之内 是三的倍数 输出Zzz 是5个倍数输出 Lll 是7的倍数输出zlzl
1 //在150之内 是三的倍数 输出Zzz 是5个倍数输出 Lll 是7的倍数输出zlzl 2 int i =1; 3 for(i = 1; i<=150;i++) 4 { 5 System. ...
- Find The Multiple 题解
Find The Multiple The long-lost Sunday is coming again, and the ACM Laboratory Elimination Competi ...