算法笔记_014:合并排序(Java)
1 问题描述
给定一组数据,使用合并排序得到这组数据的非降序排列。
2 解决方案
2.1 合并排序原理简介
引用自百度百科:
合并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。合并排序也叫归并排序。
下面看一下具体排序示例:

排序性能分析:

2.2 具体编码
package com.liuzhen.chapterFive;
public class Mergesort {
//使用合并排序,获取数组A的非降序排列
public static void getMergesort(int[] A){
int lenA = A.length; //数组A的长度
if(lenA > 1){
int[] B = copyArray(A,0); //获取数组A中前一半元素
int[] C = copyArray(A,1); //获取数组A中后一半元素
getMergesort(B); //递归排序B中元素
getMergesort(C); //递归排序C中元素
Merge(B,C,A); //合并数组B和C,返回A的非降序序列
}
}
//返回数组A前一半或者后一半的元素,参数a用于判定前一半或者后一半元素
public static int[] copyArray(int[] A,int a){
int[] result;
int len = A.length;
if(a == 0){ //当a为0时代表返回数组A的前一半元素
result = new int[len/2];
for(int i = 0;i < len/2;i++)
result[i] = A[i];
}
else{ //a不为0时代表返回数组A的后一半元素
result = new int[len-len/2];
for(int i = 0;i < (len-len/2);i++)
result[i] = A[len/2+i];
}
return result;
}
//合并数组B和C,并将其变成非降序序列存入数组A中
public static void Merge(int[] B,int[] C,int[] A){
int i = 0,j = 0,k = 0;
int lenB = B.length; //数组B的长度
int lenC = C.length; //数组C的长度
while(i<lenB && j<lenC){
if(B[i] < C[j]){
A[k] = B[i];
i++;
}
else{
A[k] = C[j];
j++;
}
k++;
}
if(i == lenB){ //当i等于lenB时,说明B数组中数已经全部存入A中,再把C数组中剩下的元素直接存入数组A中即可
while(j<lenC){
A[k] = C[j];
j++;
k++;
}
}
if(j == lenC){ //当j等于lenC时,说明C数组中数已经全部存入A中,再把B数组中剩下的元素直接存入数组A中即可
while(i<lenB){
A[k] = B[i];
i++;
k++;
}
}
}
public static void main(String[] args){
int[] A = {8,3,2,9,7,1,5,4,4,45,3,2,22};
getMergesort(A);
System.out.println("使用合并排序获得A数组的非降序序列结果如下:");
for(int i = 0;i < A.length;i++)
System.out.print(A[i]+"\t");
}
}
运行结果:
使用合并排序获得A数组的非降序序列结果如下:
1 2 2 3 3 4 4 5 7 8 9 22 45
算法笔记_014:合并排序(Java)的更多相关文章
- 算法笔记_023:拓扑排序(Java)
目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进 ...
- Java与算法之(11) - 合并排序
天下事,合久必分,分久必合.合并排序的基本思想正是先分再合. 例如对3, 1这个数列排序,首先是分,分为3和1两个数列,然后再合并并排序.合并需要额外的辅助空间,即建立一个两个数列长度之和的空数组用于 ...
- 算法笔记_129:计数排序(Java)
目录 1 问题描述 2 解决方案 2.1比较计数排序 2.2 分布计数排序 1 问题描述 给定一组数据,请使用计数排序,得到这组数据从小到大的排序序列. 2 解决方案 2.1比较计数排序 下面算法 ...
- 算法笔记_036:预排序(Java)
目录 1 问题描述 2 解决方案 2.1 检验数组中元素的唯一性 2.2 模式计算 1 问题描述 在计算机科学中,预排序是一种很古老的思想.实际上,对于排序算法的兴趣很大程度上是因为这样一个事实: ...
- 算法笔记_018:旅行商问题(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 减治法 2.2.1 Johson-Trotter算法 2.2.2 基于字典序的算法 1 问题描述 何为旅行商问题?按照非专业的说法,这个问 ...
- 合并排序 java
java 实现合并排序 package How; import java.io.BufferedReader; import java.io.BufferedWriter; import java. ...
- 算法练习5---快速排序Java版
基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成 ...
- 算法笔记_145:拓扑排序的应用(Java)
目录 1 问题描述 2 解决方案 1 问题描述 给出一些球,从1~N编号,他们的重量都不相同,也用1~N标记加以区分(这里真心恶毒啊,估计很多WA都是因为这里),然后给出一些约束条件,< a ...
- 算法练习4---冒泡排序java版
冒泡排序的基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反 ...
随机推荐
- JSP之项目路径问题(${pageContext.request.contextPath},<%=request.getContextPath()%>以及绝对路径获取)
本随笔这是作为一个记录使用,以备后查.项目完成之后本地部署OK,本地Linux部署OK,都可以正常的访问,可是当我把它部署到服务器上面的时候,首页可以正常访问,可是当发出请求的时候却报错误了,说找不到 ...
- Visual Studio 2012使用水晶报表Crystal Report
原文:Visual Studio 2012使用水晶报表Crystal Report SAP在 2013年1月14日 released SAP Crystal Reports,developer ver ...
- 解决Shockwave flash在chrome该浏览器崩溃
越来越多的人开始使用chrome浏览器,很多用户都遇到过flash崩溃.有时重启chrome为了解决,有时不可能使用chrome无论打开什么网站是什么flash.这个问题是非常小的Firefox或IE ...
- 关于覆盖Object中的hashCode, equals和toString
最近在看<Effective Java>,里面看到了关于重载hashCode.equals和toString方法的篇章,顿时觉得视野开拓了不少,而且正结合自己工作.项目中的实例,觉得有必要 ...
- Java(5/6和8)中interface和Abstract Class
这篇文章主要是自己在使用java的过程中对自己一些之前常困惑的问题的一些总结. 正如题目所言,这篇博客主要是讨论java中的接口与抽象类的区别,有自己的使用心得,以及自己平时在使用的过程中遇到的问题及 ...
- strus2 action重复执行问题
近日做项目,有两个模块功能类似,就写到了一个action中,方法起名为getXXX1,getXXX2 最后在两个模块去调用的时候,分别调用DemoAction!getXXX1.action和DemoA ...
- iOS基础 - 文本属性Attributes
NSKernAttributeName: 调整字句 kerning 字句调整 NSFontAttributeName : [UIFont systemFontOfSize:_fontSize] 设置字 ...
- winform动态的文字效果
效果图如下
- 【IOS开发】基础
1.Objective-C 为 ANSI C 添加了下述语法和功能: 定义新的类 类和实例方法 方法调用(称为发消息) 属性声明(以及通过它们自动合成存取方法) 静态和动态类型化 块 (block), ...
- asp.net mvc部署
GAC 目录: 在运行窗口中输入:C:\WINDOWS\assembly\GAC NET 2.0,3.0 GAC: c:\windows\assembly (32bit and 64bit?) .NE ...