归并排序—>分治

归并排序

  • 归并排序—>分治
  • 背景
  • 归并原理与过程
    • 原理:
    • 过程
  • 图形展示
  • 模板代码
  • 模板讲解
    • 归并例子
  • 完整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详解+例题相关推荐

  1. java8编程开发入门 李兴华_李兴华系列--JAVA详解视频(jdk1.8)及项目实战教程

    李兴华系列--JAVA详解视频教程(jdk1.8)有源码+文档01_<Oracle从入门到精通> 02_<Java8编程入门> 03_<Java8面向对象编程> 0 ...

  2. Java详解剑指offer面试题50--第一个只出现一次的字符

    Java详解剑指offer面试题50–第一个只出现一次的字符 找出字符串中找出第一个只出现一次的字符,比如输入"abacceff",则输出'b' 要想知道某个字符是不是只出现了一次 ...

  3. 十大经典排序算法-归并排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  4. 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)

    目录 最长上升子序列 一.朴素做法O(2n)O(2^n)O(2n) 二.优化做法O(nlogn)O(nlogn)O(nlogn) 三.例题引入:P1020 导弹拦截(求最长上升子序列和最长不上升子序列 ...

  5. 逆向工程生成的Mapper.xml以及*Example.java详解

    逆向工程生成的接口中的方法详解 在我上一篇的博客中讲解了如何使用Mybayis逆向工程针对单表自动生成mapper.java.mapper.xml.实体类,今天我们先针对mapper.java接口中的 ...

  6. file java详解_Java中File的实例详解

    Java中File的实例详解 File 代表文件或者目录的类 构造函数 File(File parent,String child)---代表了指定父目录下的指定的子文件或者子目录 File(Stri ...

  7. Java详解去除字符串中空格的方法

    Java去除字符串中空格的方法详解 代码中字符串使用了replaceAll()方法,去除了所有空格(其中包括:首尾空格.中间空格) 遂整理下java关于字符串去除空格的方法. 1.方法分类 str.t ...

  8. 空间复杂度(超详解+例题)

    全文目录 引言 空间复杂度 例题 test1 test2(冒泡排序) test3(求阶乘) test4(斐波那契数列) 总结 引言 在上一篇文章中,我们提到判断一个算法的好坏的标准是时间复杂度与空间复 ...

  9. websocket java详解_WebSocket详解

    WebSocket详解 WebSocket可提供一个在 单一TCP连接全双工双向通信协议.全双工意味着客户端和服务器可以独立发送信息给 对方.双向意味着客户端可以向服务器发送信息, 反之亦然. Web ...

最新文章

  1. getCacheDir() 和 getFilesDir() 的区别
  2. R 报错:package ‘***’ is not available (for R version ****) 的解决方案
  3. 学java教程之this关键字
  4. AT89C51 单片机在电话远程控制器中的应用
  5. 一文剖析区块链现状:丛林法则下的胜者
  6. lua 差值 日期_Lua获取系统时间和时间格式化方法及格式化参数
  7. unix 网络编程总结
  8. JSP自定义标签开发步骤
  9. hasChildNodes()
  10. ​LeetCode刷题实战248:中心对称数III
  11. 新乡医学院三全学院赴范县历史成就观察团
  12. c语言函数大全 chm,c语言常用函数手册 chm格式.doc
  13. 在250美元5天城市
  14. c/c++静态变量和静态函数
  15. idea设置主题背景
  16. 使用BL0942 计量芯片获取计量数据
  17. 好诗,有霸气,我喜欢!
  18. 基于PowerDC的直流压降仿真及整改分析
  19. Windows高效办公之批量创建文件夹
  20. 如何选择适用企业的CRM软件?

热门文章

  1. 面试问接口如何测试?
  2. mysql 查询不等于问题
  3. Sqli-labs Less7
  4. 数据挖掘中易犯的10大错误
  5. 卸妆·回归:“超级医保局时代“的医院信息化转型
  6. 1024分论坛:人工智能创新应用的优化实践和多产业落地
  7. Java开源Web开发框架
  8. UE4 Matinee制作相机动画及其蓝图播放(UE4.11和UE4.19测试通过)
  9. BOBST工控机触摸屏维修博斯特人机界面维修
  10. OpenCV入门 图像的边缘填充与融合