【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 本周学习了第九章:排序与查找,主要包括线性查找和二分查找算法和几种排序 ...
随机推荐
- C++检测句柄的权限
主要是依靠NtQueryObject函数,其中需要传入ObjectBasicInformation参数 PUBLIC_OBJECT_BASIC_INFORMATION结构包含可用于对象的全部信息的子集 ...
- win32 - 使用Safer API创建受限的令牌
#include <Windows.h> #include <WinSafer.h> #include <stdio.h> #include <sddl.h& ...
- 如何避免Git合并远程分支时出现可读性差的日志
问题及现象 当某一分支(假设为main)的本地仓库和远程仓库都基于同一个提交进行了修改,并分别创建了新的提交时,在本地执行git push origin main会提示先要执行git pull合并远程 ...
- drf中认证源码流程
drf中认证流程 首先通过导入from rest_framework.views import APIView,然后通过ctrl+鼠标右键进入到APIView类中,apiview中定义了许多方法,我们 ...
- 【Azure APIM】验证APIM删除后的恢复步骤
问题描述 在Azure门户中,误删除API Management资源后,怎么办? 问题解答 遇见误删除的第一反应就是: 想恢复删除的内容,但是从门户上查看没有发现有可以操作的方面. (错误,Azure ...
- 【Azure APIM】APIM 策略语句如何读取请求头中所携带的Cookie信息并保存为变量
问题描述 需要在APIM策略中对请求所携带的Cookie中的token值进行JWT验证,如果获取Cookie中的值并且作为变量保存,然后在JWT 验证中使用呢? 问题解答 第一步:获取Cookie中的 ...
- Nebula Operator 云上实践
本文首发于 Nebula Graph Community 公众号 嗨,大家好!Nebula Operator 开源也有一段时间了,之前也有一篇相关的博客介绍,但是实践相关的博客却还没有,现在: 它来了 ...
- 【主流技术】日常工作中关于 JSON 转换的经验大全(Java)
目录 前言 一.JSON 回顾 1.1结构形式 二.其它类型 -> JSON相关 2.1 JavaBean 转 JsonObject 2.2 JavaBean 转 Json 字符串 2.3 Li ...
- 第12章_MySQL数据类型精讲
第12章_MySQL数据类型精讲 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. MySQL中的数据类型 类型 类型举例 整数类型 TINYINT. ...
- iview select 下拉 多选 数组 外面包一层 数组改逗分,外层不能用v-model 要用 :value @input,input里面要把对象解构下,才能过验证 - vue
iview select 下拉 多选 数组 外面包一层 数组改逗分,外层不能用v-model 要用 :value @input,input里面要把对象解构下,才能过验证 - vue