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实现合并排序的更多相关文章

  1. 合并排序 java

    java  实现合并排序 package How; import java.io.BufferedReader; import java.io.BufferedWriter; import java. ...

  2. Java与算法之(11) - 合并排序

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

  3. 算法笔记_014:合并排序(Java)

    1 问题描述 给定一组数据,使用合并排序得到这组数据的非降序排列. 2 解决方案 2.1 合并排序原理简介 引用自百度百科: 合并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Div ...

  4. java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述

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

  5. lintcode:合并排序数组

    题目: 合并排序数组 合并两个排序的整数数组A和B变成一个新的数组. 样例 给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6] 挑战 你能否优化你的算法,如果 ...

  6. 用javascript比较快速排序和合并排序的优劣

    <script> //用来调用排列方法的类 function arr_sort(arr){ var startTime,endTime; var priv_arr = new Array; ...

  7. Java中的排序算法(2)

    Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...

  8. julia文件合并排序.jl

    julia文件合并排序.jl """ julia文件合并排序.jl http://bbs.bathome.net/thread-39841-1-1.html 2016年3 ...

  9. lintcode:合并排序数组 II

    题目: 合并排序数组 II 合并两个排序的整数数组A和B变成一个新的数组. 样例 给出A = [1, 2, 3, empty, empty] B = [4,5] 合并之后A将变成[1,2,3,4,5] ...

随机推荐

  1. c#得出两个列表的交集

    c#提供了Intersect来得到两个列表的交集,它是通过使用默认的相等比较器对值进行比较生成两个序列的交集,定义为: public static IEnumerable<TSource> ...

  2. kubernetes部署redis主从高可用集群

    1.redis主从高可用集群结构 2.k8s部署有状态的服务选择 对于K8S集群有状态的服务,我们可以选择deployment和statefulset statefulset service& ...

  3. 在ef core中使用postgres数据库的全文检索功能实战之中文支持

    前言 有关通用的postgres数据库全文检索在ef core中的使用方法,参见我的上一篇文章. 本文实践了zhparser中文插件进行全文检索. 准备工作 安装插件,最方便的方法是直接使用安装好插件 ...

  4. Ubuntu+uWSGI部署Django项目【鸿篇巨制,事无巨细】

    背景 任务: 视频翻译项目需要在两个服务器上进行通信(国内&海外的阿里服务器). 因为python是主语言,选用了Django 来快速部署API. 注:Django中文文档:https://d ...

  5. Mockito如何mock一条链式调用

    在写单元测试的时候,不免可能需要mock一些对象出来,并且mock一些方法调用去返回一个自己想要的对象.一般的使用是这样的: FinalPumpkin pumpkin = mock(FinalPump ...

  6. jenkins 流水线学习

    最佳实践: https://www.cnblogs.com/itech/p/5678643.html 一些样例 https://jenkins.io/doc/pipeline/examples/ gi ...

  7. Linux下几个与磁盘空间和文件尺寸相关的命令

    大家好,我是良许. 硬盘是计算机非常重要的一个部件,不管是代码,还是 UI .声音.文档,抑或是没人时偷偷看的小视频,都需要保存在硬盘里. 对于很多 Linux 服务器,会进行很多的编译操作.而编译操 ...

  8. [A*算法]基于Unity实现A*算法(二)

    写在前面:上一篇当时是非常简单的了解一下A*,昨天还有一些问题没解决,就暂时把自己查阅的文坛摘抄了过来(毕竟人家写的比我要好的多 :> ) 今天终于解决了,就又写了这一篇,正好我自己再梳理一遍, ...

  9. Fabric进阶(二)—— 在已有组织中增加节点

    fabric网络在创建时就已经确定了初始的节点数量,而在实际应用场景中可能会需要在某个组织中动态增加节点.这里以balance-transfer v1.0为例(2 Org,4 Peer),介绍如何在o ...

  10. 解决使用IDEA启动Tomcat成功但localhost:8080无法访问的问题

    解决使用IDEA启动Tomcat成功但localhost:8080无法访问的问题