Java实现合并排序
1 问题描述
给定一组数据,使用合并排序得到这组数据的非降序排列。
2 解决方案
2.1 合并排序原理简介
引用自百度百科:
合并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为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
Java实现合并排序的更多相关文章
- 合并排序 java
java 实现合并排序 package How; import java.io.BufferedReader; import java.io.BufferedWriter; import java. ...
- Java与算法之(11) - 合并排序
天下事,合久必分,分久必合.合并排序的基本思想正是先分再合. 例如对3, 1这个数列排序,首先是分,分为3和1两个数列,然后再合并并排序.合并需要额外的辅助空间,即建立一个两个数列长度之和的空数组用于 ...
- 算法笔记_014:合并排序(Java)
1 问题描述 给定一组数据,使用合并排序得到这组数据的非降序排列. 2 解决方案 2.1 合并排序原理简介 引用自百度百科: 合并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Div ...
- java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...
- lintcode:合并排序数组
题目: 合并排序数组 合并两个排序的整数数组A和B变成一个新的数组. 样例 给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6] 挑战 你能否优化你的算法,如果 ...
- 用javascript比较快速排序和合并排序的优劣
<script> //用来调用排列方法的类 function arr_sort(arr){ var startTime,endTime; var priv_arr = new Array; ...
- Java中的排序算法(2)
Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...
- julia文件合并排序.jl
julia文件合并排序.jl """ julia文件合并排序.jl http://bbs.bathome.net/thread-39841-1-1.html 2016年3 ...
- lintcode:合并排序数组 II
题目: 合并排序数组 II 合并两个排序的整数数组A和B变成一个新的数组. 样例 给出A = [1, 2, 3, empty, empty] B = [4,5] 合并之后A将变成[1,2,3,4,5] ...
随机推荐
- Semaphore和AQS
Semaphore意思的信号量,它的作用是控制访问特定资源的线程数量 构造方法: public Semaphore(int permits) public Semaphore(int permits, ...
- flink批处理从0到1学习
一.DataSet API之Data Sources(消费者之数据源) 介绍: flink提供了大量的已经实现好的source方法,你也可以自定义source 通过实现sourceFunction接口 ...
- HDU 2011 (水)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2011 题目大意:给你 m 个数,对于每个数,求前 n 项和,数列:1 - 1/2 + 1/3 - 1/ ...
- Linux学习第二道坎——系统目录结构及其作用
如果说Linux学习的第一道坎是系统安装及对磁盘分区的理解,那么第二道坎就应该是对Linux系统目录结构及其作用的掌握了(这里主要指根目录 / 下的一级目录)! 随着Linux的不断发展,Linux的 ...
- java读取文件内容常见几种方式
①随机读取文件内容 ②以行为单位读取文件,常用于读面向行的格式化文件 ③以字符为单位读取文件,常用于读文本,数字等类型的文件 ④以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件 pa ...
- Copy与mutableCopy的个人理解
Copy与mutableCopy的个人理解 1. 相同点 都是将原有对象进行深拷贝(狭义) 这里的狭义上的深拷贝指的是在不考虑编译器在编译时对不可变对象进行copy时采取的优化策略:即将不可变对象的地 ...
- Python list列表修改元素
Python 提供了两种修改列表(list)元素的方法,你可以每次修改单个元素,也可以每次修改一组元素(多个). 修改单个元素 修改单个元素非常简单,直接对元素赋值即可.请看下面的例子: nums = ...
- Java的泛型详解(一)
Java的泛型详解 泛型的好处 编写的代码可以被不同类型的对象所重用. 因为上面的一个优点,泛型也可以减少代码的编写. 泛型的使用 简单泛型类 public class Pair<T> { ...
- 快手4-5月Java岗面经
快手面试准备 我的牛客网帖子链接:https://www.nowcoder.com/discuss/429362 一面: 基础知识 1.java基本数据类型(8种) 1.基本数据类型有哪些,各占多少位 ...
- python3.x 基础一
1.python 格式化print #/usr/bin/env python #-*- coding: utf-8 -*- #Author:jenvid.yang # 连接符号+,可以连接多个变量或者 ...