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] ...
随机推荐
- Java中this()和super()
Java关键字this只能用于方法体中.this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this,并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的th ...
- java mybatis中大于号小于号的转义
大于号: > 小于号: <
- java-> 分包分层
项目分层(分包)的作用 程序为什么要分包分层? 以顾客去饭店吃饭案例分析一下: 小饭店: 一个服务员搞定(接待顾客\点菜\炒菜) 大饭店: 迎宾员(是否有预定\ 询问吃中餐还是西餐或者烧烤等\ 几位用 ...
- 在IntelliJ IDEA中创建和运行java/scala/spark程序
本文将分两部分来介绍如何在IntelliJ IDEA中运行Java/Scala/Spark程序: 基本概念介绍 在IntelliJ IDEA中创建和运行java/scala/spark程序 基本概念介 ...
- sonar 安装,centos7配置优化
/etc/sysctl.conf /etc/systemd/system.conf /etc/security/limits.conf /proc/sys/fs/file-max /etc/secur ...
- js实现图片幻灯片效果
其效果是点击图片切换到下一张图片 首先准备五张图片 <ul class="imge"> <li><img src="images/1.jpg ...
- maven and dubbo
maven是什么 maven是一个项目管理和构建自动化工具. 核心概念 pom (project object model) mvn compile 编译 mvn package 编译成一个jar的包 ...
- [Unity A*算法]A*算法的简单实现
写在前面:之前看过一点,然后看不懂,也没用过. 最近正好重构项目看到寻路这块,想起来就去查查资料,总算稍微理解一点了,下面记录一下自己的成果(哈哈哈 :> ) 下面分享几篇我觉得挺不错的文章 A ...
- Java并发编程详解读书笔记(一)
一.线程介绍 讲线程之前得先了解进程(Peocess),现在的操作系统基本都支持多任务的进行,举个场景:有许多的程序员们喜欢边coding边听点轻音乐.这时计算机就是做并行任务,也就是有多个进程在同时 ...
- scrapy爬取效率提升配置
增加并发: 默认scrapy开启的并发线程为32个,可以适当进行增加.在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100. 降低日志级别 ...