一、排序思想

将两个或两个以上的一排序文件合并成一个有序文件的过程叫归并,而归并排序就是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将以有序的了序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为“二路归并”。

二、图解案例

三、代码实现

  1. /**
  2. * 归并排序序演示
  3. *
  4. * @author Lvan
  5. */
  6. public class MergeSort {
  7. public static void main(String[] args) {
  8. int[] arr = {5, 1, 7, 3, 1, 6, 9, 4};
  9.  
  10. mergeSort2Down(arr, 0, arr.length - 1);
  11.  
  12. for (int i : arr) {
  13. System.out.print(i + "\t");
  14. }
  15. }
  16.  
  17. /**
  18. * 分发器/汇聚器
  19. *
  20. * @param arr 待排序列
  21. * @param start 待排序列起始值
  22. * @param end 待排序列结束值
  23. */
  24. private static void mergeSort2Down(int[] arr, int start, int end) {
  25. if (arr == null || start >= end) {
  26. return;
  27. }
  28.  
  29. //获取待排序列中间位置
  30. int mid = (start + end) / 2;
  31.  
  32. //递归排序左边[start,mid]集合
  33. mergeSort2Down(arr, start, mid);
  34. //递归排序右边[mid+1,end]集合
  35. mergeSort2Down(arr, mid + 1, end);
  36.  
  37. //合并左边与右边的有序集合
  38. merge(arr, start, mid, end);
  39. }
  40.  
  41. /**
  42. * 将两个有序序列合并
  43. *
  44. * @param arr 待排序列
  45. * @param start 待排序列开始值
  46. * @param mid 待排序列中间位置索引
  47. * @param end 待排序列结束值
  48. */
  49. private static void merge(int[] arr, int start, int mid, int end) {
  50. //temp用于汇总2个有序集合的临时集合
  51. int[] temp = new int[end - start + 1];
  52. //第1个有序集合索引
  53. int i = start;
  54. //第二个有序集合索引
  55. int j = mid + 1;
  56. //临时集合索引
  57. int k = 0;
  58.  
  59. //将2个有序集合,插入到临时集合temp中
  60. while (i <= mid && j <= end) {
  61. if (arr[i] <= arr[j]) {
  62. temp[k++] = arr[i++];
  63. } else {
  64. temp[k++] = arr[j++];
  65. }
  66. }
  67.  
  68. while (i <= mid) {
  69. temp[k++] = arr[i++];
  70. }
  71.  
  72. while (j <= end) {
  73. temp[k++] = arr[j++];
  74. }
  75.  
  76. //将temp中的数据放入arr集合中
  77. for (i = 0; i < k; i++) {
  78. arr[start + i] = temp[i];
  79. }
  80. }
  81. }

归并排序——Java实现的更多相关文章

  1. 归并排序 求逆序数 链表的归并排序 多线程归并排序 java

    import java.util.Scanner; public class Main { private static int count=0; public static void mergeso ...

  2. 二路归并排序java实现

    二路归并排序:其核心思想时将问题一分为二,并递归调用一分为二方法,使问题分割到不能再分各的原子问题,然后再归并,从实现原子问题开始,层层向上归并,最终解决整体问题.即所谓“分而治之,万流归一” 二路归 ...

  3. 自顶向下(递归)的归并排序和自底向上(循环)的归并排序——java实现

    归并排序有两种实现方式,自顶向下和自底向上.前者的思想是分治法,现将数组逐级二分再二分,分到最小的两个元素后,逐级往上归并,故其核心在于归并.后者的思想相反,采用循环的方式将小问题不断的壮大,最后变成 ...

  4. 单向链表的归并排序——java实现

    在做Coursera上的Algorithms第三周测验练习的时候有一道链表随机排序问题,刚开始没有什么思路,就想着先把单向链表归并排序实现了,再此基础上进行随机排序的改造.于是就结合归并排序算法,实现 ...

  5. 归并排序-java

    排序-归并排序 基本思想:是指将两个或两个以上的有序表合并成一个新的有序表. 具体步骤: (1首先将整个表看成是n个有序子表,每个子表的长度为1. (2)然后两两归并,得到n/2个长度为2的有序子表. ...

  6. leetcode23 多个拍好序的链表进行归并排序 (java版本)

    题目: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...

  7. 归并排序java

    import java.util.Arrays; public class MergeSort { public static void main(String[] args) { MergeSort ...

  8. 归并排序—Java版

    一开始做算法的时候,感觉递归算法很绕,所以我就在阅读别人代码的基础上,对代码每一步都添加自己的注解,方便我以后的学习. public class MergeSort { /** * 归并排序 * @p ...

  9. 归并排序Java实现

    package practice; import edu.princeton.cs.algs4.*; /* * 归并排序 * 时间复杂度O(NlgN) N为数组长度 * 归并排序在小数组上表现并不好可 ...

随机推荐

  1. loj #2255. 「SNOI2017」炸弹

    #2255. 「SNOI2017」炸弹 题目描述 在一条直线上有 NNN 个炸弹,每个炸弹的坐标是 XiX_iX​i​​,爆炸半径是 RiR_iR​i​​,当一个炸弹爆炸时,如果另一个炸弹所在位置 X ...

  2. loj #6121. 「网络流 24 题」孤岛营救问题

    #6121. 「网络流 24 题」孤岛营救问题   题目描述 1944 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂, ...

  3. DOM操作技术之动态脚本与动态样式(兼容版)

    动态脚本 使用<script>元素可以向页面中插入Javascript代码,一种方式是通过其src特性包含外部文件,另一种方式就是用这个元素本身来包含代码. 而我们要说的动态脚本,指的是在 ...

  4. jvm学习笔记之对象详解

    一.对象的组成 对象头(Header): 运行时数据:存储对象运行时的数据,如哈希码.GC分代年龄.锁状态标志.线程持有的锁.偏向线程ID.偏向时间戳等,这部分数据官方成为“Mark Word”,它的 ...

  5. I/O(输入/输出)---序列化与反序列化

    概念: 序列化就是将对象的状态存储到特定的介质中的过程,也就是将对象状态转换为可保持或传输格式的过程. 反序列化则是从特定存储介质中将数据重新构建对象的过程.可以将存储在文件上的对象信息读取,然后重新 ...

  6. 数学【洛谷P4071】 [SDOI2016]排列计数

    P4071 [SDOI2016]排列计数 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列 ...

  7. 华为敏捷DevOps实践:产品经理如何开好敏捷回顾会议

    大家好,我是华为云DevCloud项目管理服务的产品经理 恒少:) 作为布道师和产品经理,出差各地接触客户是常态,经常和华为云的客户交流.布道.技术沙龙,但是线下交流,覆盖的用户总还是少数.我希望借助 ...

  8. java集合之Set接口

    Set集合通常不能记住元素添加的顺序,其他的操作和它的父接口基本相同.只是行为上有细微的差别,Set集合不能包含相同的元素.如果尝试添加相同的元素,调用add()方法将返回false,且新元素不能被加 ...

  9. redux超易学三篇之二(开始使用react-redux)

    其实 redux 真正让人感到混乱的还是在 react-redux 的使用中. 请配合完整代码参考~:完整源代码 也不是说混乱,主要是网上 推崇 最佳实践.学习一个新东西的时候,本来就很陌生,上来就用 ...

  10. A printf format reference page (cheat sheet)

    Summary: This page is a printf formatting cheat sheet. I originally created this cheat sheet for my ...