合并排序-解析


  算法设计有很多方法,前面说过的插入排序使用的是增量(incremental)方法:在排好子数组 A[ 1……j -1] 后,将元素 A[j] 插入,形成排好序的子数组 A[ 1……j]。

  这次,要介绍的是另一设计策略,叫做 “分治法” (divide-and-conquer)。下面要用分治法来设计一个排序算法-合并排序(merge-sort),使其性能比插入排序好得多。



分治法

有很多算法在结构上是递归的:为了解决一个给定的问题,算法要一次或多次地递归调用其自身来解决相关的子问题。这些算法通常采用分治策略:将原问题划分为 n 个规模较小而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。

  分治模式在每一层递归上都有三个步骤:

  分解(divide):将原问题分解成一系列子问题;

  解决(conquer):递归地解决各个子问题,若子问题足够小,则直接求解;

  合并(combine):将子问题的结果合并成原问题的解。


合并排序算法完全依照了上述模式,直观地操作如下:

  分解:将 n 个元素分成各含 n/2 个元素的子序列;

  解决:用合并排序法对两个子序列递归地排序;

  合并:合并两个已排序的子序列以得到排序结果。

  在对子序列排序时,其长度为 1 时递归结束。单个元素被视为是已排好序的。


合并排序在数组

A = <5  2  4  7  1  3  2  6> 上的处理过程。随着算法的处理过程由底向上进展,待合并的已排序列长度不断增加。


Java代码:

 1 import java.util.*;
 2
 3 public class Merge_Sort {
 4
 5
 6 /*
 7 ******************************开始写代码******************************/
 8     static void merge_Sort(int[] arr){
 9         int length = arr.length;
10         int mid = length/2;
11         if(length > 1){
12             int[] left = Arrays.copyOfRange(arr, 0, mid);//复制左半部分
13             int[] right = Arrays.copyOfRange(arr, mid, length);//复制右半部分
14             merge_Sort(left);//递归左边
15             merge_Sort(right);//递归右边
16             merge(arr,left,right);//合并数组
17         }
18     }
19
20     static void merge(int[] result, int[] left, int[] right) {
21         int i = 0, l = 0, r = 0;
22         while(l < left.length && r < right.length){
23             if(left[l] < right[r] )
24                 result[i++] = left[l++];
25             else
26                 result[i++] = right[r++];
27         }
28         while(l < left.length){//若left数组剩余,则后面依次复制给result
29             result[i++] = left[l++];
30         }
31         while(r < right.length){//反之
32             result[i++] = right[r++];
33         }
34     }
35 /******************************结束写代码******************************/
36
37
38     public static void main(String[] args){
39         Scanner in = new Scanner(System.in);
40         int[] res;
41
42         int _a_size = 0;
43         _a_size = Integer.parseInt(in.nextLine().trim());//输入数组大小
44         int[] _a = new int[_a_size];
45         int _a_item;
46         for(int _a_i = 0; _a_i < _a_size; _a_i++) {
47             _a_item = Integer.parseInt(in.nextLine().trim());//输入数组
48             _a[_a_i] = _a_item;
49         }
50
51          merge_Sort(_a);
52         for(int _a_i=0; _a_i < _a.length; _a_i++) {
53             System.out.print(String.valueOf(_a[_a_i])+" ");
54         }
55
56     }
57 }

结果截图:

PS:合并是一种稳定的排序算法

堆排序、快速排序、希尔排序、直接选择排序不是稳定的排序算法,

而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。

转载于:https://www.cnblogs.com/denglw/p/6807185.html

合并排序(Java)-解析相关推荐

  1. JAVA实现分治法的合并排序及解析

    合并排序的思路 本文将讨论用分治法来实现的合并排序.将问题拆分成几个规模较小但类似于原问题的子问题,再递归去求解这些子问题,最后再合并这些子问题的解来建立原问题的解. 每层递归时都有三个步骤: 分解: ...

  2. java 数据合并算法_Java与算法之(11) - 合并排序

    天下事,合久必分,分久必合.合并排序的基本思想正是先分再合. 例如对3, 1这个数列排序,首先是分,分为3和1两个数列,然后再合并并排序.合并需要额外的辅助空间,即建立一个两个数列长度之和的空数组用于 ...

  3. 排序算法python实现_合并排序算法– Java,C和Python实现

    排序算法python实现 Merge sort is one of the most efficient sorting algorithms. It works on the principle o ...

  4. java合并排序_Java中的合并排序算法

    合并排序算法是一种分而治之的算法.在分而治之的范式中,一个问题被分解成较小的问题,其中每个小问题仍然保留着大问题的所有属性--大小除外.为了解决原始问题,每个部分都是单独解决的,然后这些部分又合并在一 ...

  5. Java实现合并排序(归并)详细代码

    归并排序的思路 归并排序通过不断的将原数组进行拆分(通常拆分成左右两项),一直到剩下一项,然后分别将拆分的子数组进行合并,此时,两个子数组已经是排好序的,所以合并排序只需要进行一趟排序即可完成,所以此 ...

  6. java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序...

    算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...

  7. Java实现合并排序

    合并排序法(Merge Sort)工作原理是针对已排序好的两个或两个以上的数列(或数据文件),通过合并的方式,将其组合成一个大的且已排好序的数列(或数据文件). 1.将N个长度为1的键值,成对地合并成 ...

  8. easyexcel生成excel_阿里JAVA解析Excel工具easyexcel

    java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有 ...

  9. 链表节点合并排序:数组和单链表

    每日一贴,今天的内容关键字为链表节点 1 数组合并排序 1.1 合并两个已排序好的数组 需要额定的存储空间用来存储合并结果 //merge two array which are already so ...

最新文章

  1. 显示DataGrid序号的一个适用的方法
  2. python完美立方数_Python练习实例3 | 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?...
  3. java对象的强引用,软引用,弱引用和虚引用
  4. 文本编辑器左边显示行数
  5. 4.2 深层网络中的前向传播-深度学习-Stanford吴恩达教授
  6. JS 获取控件的绝对位置
  7. iOS app 右滑返回
  8. J2EE dynamic web工程搭建 struts2
  9. 跑步记录日期怎么改_快捷增加历史记录-鲨鱼记账App功能优化
  10. OpenMP、MPICH与OpenMPI
  11. 计算机操作系统课程有什么关系,计算机操作系统课程教学大纲(洪联系).doc
  12. 2021年中国电热饭盒市场趋势报告、技术动态创新及2027年市场预测
  13. SQLite学习笔记
  14. js实现导出Excel文档
  15. 发光二极管压降, 也就是最小导通电压
  16. C# Thread详解
  17. 书籍推荐《麦肯锡教我的写作武器》
  18. iOS开源库–最全的整理
  19. 【python】20行代码实现有道翻译api接口调用
  20. Python 小数/浮点数(详解)

热门文章

  1. 怎样加速微软商店服务器,windows10系统如何加快应用商店打开速度【图文教程】...
  2. mysql ddl crash,MySQL5.6 crash-safe replication一个坑
  3. 社交网站将推动手游发展
  4. mysql8.0mis安装教程
  5. python 中 pynlpir错误 Cannot Open Configure file pynlpir解决
  6. linux 远程控制详细安装 -- VNC (转)
  7. [转帖]Linux修改时区
  8. 每天学点Python之collections
  9. eos交易同步过程和区块生产过程源码分析
  10. 关于js css html加载顺序整理