归并排序Java详解+例题
归并排序—>分治
归并排序
- 归并排序—>分治
- 背景
- 归并原理与过程
- 原理:
- 过程
- 图形展示
- 模板代码
- 模板讲解
- 归并例子
- 完整java代码
背景
归并排序是十大排序之一
十大排序:
归并原理与过程
原理:
取中值,将数组分成左右部分,分别对两边再次分成两个部分,一直到最终一边只有两个数,如何进行双指针从两端进行判定,若左端,比右端大,则交换两个位置的值。
过程
首先取数组中值,进行左右两边归并排序,调用递归。然后运用双指针算法(若不会,请看快速排序有讲解)判断两端的值,在适合条件下进行交换。最后完成所有区间的排序。
图形展示
最后,将所有区间的值进行排序合并
2 1 排序
2 1 4 排序
3 5 排序
2 1 4 3 5 排序
模板代码
int mid = r + l >>1;
mergeSort(q , l , mid );
mergeSort(q , mid + 1 , r);
//合并,取k 值
int k = 0 ,i = l , j = mid + 1;
while (i <= mid && j <= r) {if (q[i] <= q[j]) tem[k++] = q[i++];else tem[k++] = q[j++];
}
while(j <= r) tem[k++] = q[j++];
while(i <= mid) tem[k++] = q[i++];
//从左边界 到右边界 进行数组赋值
for (i = l , j = 0 ; i <= r ; i++ , j++) q[i] = tem[j];
模板讲解
int mid = r + l >>1; // 取中值
mergeSort(q , l , mid );
mergeSort(q , mid + 1 , r); //进行左右递归
while (i <= mid && j <= r) {
if (q[i] <= q[j]) tem[k++] = q[i++];
else tem[k++] = q[j++];
}
// 比较两个数的值,符合条件 写入临时数组
while(j <= r) tem[k++] = q[j++];
while(i <= mid) tem[k++] = q[i++];
//如果比较过程中,两边数组没有完全写入临时数组,需将其写入
归并例子
1 与 3 比较 存入 1 ;
2 与 3 比较 存入 2 ;
4 与 3 比较 存入 3 ;
4 与 5 比较 存入 4 ;
这时,5 仍在原数组中需要将其写入临时数组
同理。右边也可能需要将多余的数进行写入
所有有这两行代码
while(j <= r) tem[k++] = q[j++];
while(i <= mid) tem[k++] = q[i++];
最后
for (i = l , j = 0 ; i <= r ; i++ , j++) q[i] = tem[j];
//将临时数组写入原数组,完成归并排序
完整java代码
import java.io.BufferedReader;
import java.io.InputStreamReader;/*** @author JDsen99* @description* @createDate 2021/7/6-10:52*/
public class Main {public final static int N = (int) (1e6 + 10);public static int[] tem = new int[N];public static void main(String[] args) throws Exception {InputStreamReader is = new InputStreamReader(System.in);BufferedReader rd = new BufferedReader(is);String str = rd.readLine();String num[] = rd.readLine().split(" ");int n = Integer.parseInt(str);int[] arr = new int[n];for(int i = 0;i < n;i++) {arr[i] = Integer.parseInt(num[i]);}mergeSort(arr,0,n-1);for(int i = 0;i < n;i++) System.out.printf("%d ",arr[i]);rd.close();is.close();}static void mergeSort(int[] q, int l,int r) {//边界判断if (l >= r) return;//取中值int mid = r + l >>1;//递归mergeSort(q,l,mid);mergeSort(q,mid+1,r);//合并int k = 0 ,i = l , j = mid + 1;while (i <= mid && j <= r) {if (q[i] <= q[j]) tem[k++] = q[i++];else tem[k++] = q[j++];}//多余的已经排序的数写入临时数组while(j <= r) tem[k++] = q[j++];while(i <= mid) tem[k++] = q[i++];//写入原数组for (i= l,j= 0;i<=r;i++,j++) q[i] = tem[j];}}
这就是归并排序
核心
调用递归对左右两边进行排序
然后,合并两个数组。(这里使用临时数组保存)
若有问题请提出哦。
归并排序Java详解+例题相关推荐
- java8编程开发入门 李兴华_李兴华系列--JAVA详解视频(jdk1.8)及项目实战教程
李兴华系列--JAVA详解视频教程(jdk1.8)有源码+文档01_<Oracle从入门到精通> 02_<Java8编程入门> 03_<Java8面向对象编程> 0 ...
- Java详解剑指offer面试题50--第一个只出现一次的字符
Java详解剑指offer面试题50–第一个只出现一次的字符 找出字符串中找出第一个只出现一次的字符,比如输入"abacceff",则输出'b' 要想知道某个字符是不是只出现了一次 ...
- 十大经典排序算法-归并排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)
目录 最长上升子序列 一.朴素做法O(2n)O(2^n)O(2n) 二.优化做法O(nlogn)O(nlogn)O(nlogn) 三.例题引入:P1020 导弹拦截(求最长上升子序列和最长不上升子序列 ...
- 逆向工程生成的Mapper.xml以及*Example.java详解
逆向工程生成的接口中的方法详解 在我上一篇的博客中讲解了如何使用Mybayis逆向工程针对单表自动生成mapper.java.mapper.xml.实体类,今天我们先针对mapper.java接口中的 ...
- file java详解_Java中File的实例详解
Java中File的实例详解 File 代表文件或者目录的类 构造函数 File(File parent,String child)---代表了指定父目录下的指定的子文件或者子目录 File(Stri ...
- Java详解去除字符串中空格的方法
Java去除字符串中空格的方法详解 代码中字符串使用了replaceAll()方法,去除了所有空格(其中包括:首尾空格.中间空格) 遂整理下java关于字符串去除空格的方法. 1.方法分类 str.t ...
- 空间复杂度(超详解+例题)
全文目录 引言 空间复杂度 例题 test1 test2(冒泡排序) test3(求阶乘) test4(斐波那契数列) 总结 引言 在上一篇文章中,我们提到判断一个算法的好坏的标准是时间复杂度与空间复 ...
- websocket java详解_WebSocket详解
WebSocket详解 WebSocket可提供一个在 单一TCP连接全双工双向通信协议.全双工意味着客户端和服务器可以独立发送信息给 对方.双向意味着客户端可以向服务器发送信息, 反之亦然. Web ...
最新文章
- getCacheDir() 和 getFilesDir() 的区别
- R 报错:package ‘***’ is not available (for R version ****) 的解决方案
- 学java教程之this关键字
- AT89C51 单片机在电话远程控制器中的应用
- 一文剖析区块链现状:丛林法则下的胜者
- lua 差值 日期_Lua获取系统时间和时间格式化方法及格式化参数
- unix 网络编程总结
- JSP自定义标签开发步骤
- hasChildNodes()
- ​LeetCode刷题实战248:中心对称数III
- 新乡医学院三全学院赴范县历史成就观察团
- c语言函数大全 chm,c语言常用函数手册 chm格式.doc
- 在250美元5天城市
- c/c++静态变量和静态函数
- idea设置主题背景
- 使用BL0942 计量芯片获取计量数据
- 好诗,有霸气,我喜欢!
- 基于PowerDC的直流压降仿真及整改分析
- Windows高效办公之批量创建文件夹
- 如何选择适用企业的CRM软件?