选择排序的升级版本归并排序, 归并排序有二路归并,三路归并和多路归并,我这次只分析下二路归并,有机会在分析下别的。

归并排序的思想是这样的:

设数组a中存放了n个数据元素,初始时我们把它们看成是n个长度为1的有序子数组,然后从第一个子数组开始,把相临的子数组两两合并,得到n/2个(若n/2为小数则上取整)长度为2的新的有序子数组(当n为奇数时最后一个新的有序子数组的长度为1);对这些新的有序子数组再两两归并;如此重复,直到得到一个长度为n的有序数组为止。多于二路的归并排序方法和二路归并排序方法类同。

步骤:

1、首先是将数组分开, 应用递归的方式, 简单暴力;

2、然后对数组进行两辆归并(就是合并为一个数组的过程);

3、第二步的过程中需要创建一个新的数组,对改变顺序后的原数组的部分进行保存;‘

//也许代码是说明问题的最好方法, 代码中已经做了注释

packagemerge;public classMergeSort {//接收传来的参数 对数组进行拆分

public int[] sort(int[] array, int low, inthigh) {if (low

sort(array, low, middle);

sort(array, middle+ 1, high);//进行排序和合并

merge(array, low, middle, high);

}returnarray;

}//进行排序和合并

public void merge(int[] array, int low, int middle, inthigh) {//创建一个临时数组

int cLow =low;int[] tempArray = new int[array.length];//定义临时数组及参数数组下标如下:

int tempIndex =low;int right = middle + 1;while(low <= middle && right <=high){if(array[low]

tempArray[tempIndex++] = array[low++];

}else{

tempArray[tempIndex++] = array[right++];

}

}//如果条件满足的话,对middle前面的还没有存入的直接放入tempArray,因为middle后面的已经没有了

while(low <=middle){

tempArray[tempIndex++] = array[low++];

}//原理和上面的相同

while(right <=high){

tempArray[tempIndex++] = array[right++];

}//将排序后的 部分数组 重新放入原数组

for(int i = cLow; i <= high; i++){

array[i]=tempArray[i];

}

}

}

测试类如下:

packageTest;importmerge.MergeSort;;public classTest {public static voidmain(String[] args) {

MergeSort mergeSort= newMergeSort();int[] array =createArray();long ct1 =System.currentTimeMillis();int[] arrays = mergeSort.sort(array, 0, array.length - 1);long ct2 =System.currentTimeMillis();

display(arrays);

System.out.println("所消耗的时间:" + (ct2 - ct1) + " ms");

}public static void display(int[] arrays) {

System.out.println("排序后数据:");for (int i = 0; i < arrays.length; i++) {

System.out.print(arrays[i]+ "\t");if ((i + 1) % 10 == 0) {

System.out.println();

}

}

System.out.println();

}public static int[] createArray() {int[] array = new int[100000];

System.out.println("数组中元素是:");for (int i = 0; i < 100000; i++) {

array[i]= (int) (Math.random() * 1000);

System.out.print(array[i]+ "\t");if ((i + 1) % 10 == 0) {

System.out.println();

}

}

System.out.println();returnarray;

}

}

归并排序对 100000个数进行排序的时间大约是  4300ms  , 可见比快排的效率低了很多。

时间复杂度的分析:

归并排序的总的时间复杂度为O(nlog2 n)。

归并排序需要的附加存储空间为O(n),所需辅助空间较大。

二路归并排序是稳定的。

java 多路归并_归并排序(Java)相关推荐

  1. 用java实现归并,算法:JAVA实现归并排序

    1.核心思想 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序. 若将两个有序 ...

  2. java正则表达式 匹配()_学习Java正则表达式(匹配、替换、查找)

    import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public c ...

  3. java核心教程_核心Java教程

    java核心教程 Welcome to Core Java Tutorial. I have written a lot on Core Java and Java EE frameworks. Th ...

  4. java 包命名_【Java】包的命名规则

    命名规范 包:所有单词的字母小写,之后每个单词用-隔开,如 org.nemo.demo 常量:所有单词的字母大写,之后每个单词用_隔开,如 FLAG 类:所有单词的首字母大写,如 TestJava p ...

  5. java 删除语句_是java语句

    <21天学通Java(第7版)>-- 第2章 Java编程基础 2.1 语句和表达式 本节书摘来异步社区<21天学通Java(第7版)>一书中的第2章,第2.1节,作者: [美 ...

  6. java 图片效果_使用Java进行图片底片化效果处理

    使用java代码读取图片,并进行底片化处理 util importjava.awt.image.BufferedImage;importjava.io.File;importjava.util.Arr ...

  7. java array缓存_有java数组

    [JAVA零基础入门系列]Day10 Java中的数组 [JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 D ...

  8. java 分割一个_分割java

    [java]分割字符串工具类,霸气 jdk自带的 java 分割字符串,分割string,可以根据多个条件去分割.比如逗号,分号,逗号或者分号. 比如一个字符串:"abc,def;gh,ij ...

  9. java 字符串包_包java字符串

    Java核心技术卷I基础知识3.6.3 不可变字符串 3.6.3 不可变字符串 String类没有提供用于修改字符串的方法.如果希望将greeting的内容修改为"Help!",不 ...

  10. java path类_基于java Files类和Paths类的用法(详解)

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem ...

最新文章

  1. python装饰器 property_python @property装饰器
  2. 酶促反应动力学_酶促反应动力学实验
  3. java 暂停多线程_关于java中多线程的暂停
  4. JZOJ 5643. 【NOI2018模拟4.10】最小代价
  5. 304不锈钢蒸玉米后一层黑色
  6. Oracle结构设计技巧(访问数据库象访问内存一样 快)
  7. python tclerror_TclError:错误的窗口路径名(Python)
  8. Cookie、Session 和 Token区别
  9. 【记录】jenkins 安装及环境配置(二)
  10. Linux Shell基础 - Shell 脚本的执行方式
  11. (?i) 和 re.sub
  12. linux脚本转win7脚本,使用一个脚本让Ubuntu“变身”Windows7
  13. 阶段3 3.SpringMVC·_03.SpringMVC常用注解_6 CookieValue注解
  14. 悟空CRM系统学习心得
  15. ESD笔记(三)_常用ESD保护电路优缺点
  16. .woff2/svg/woff文件报404错误
  17. 三级分销系统产品设计原理
  18. php 微信发红包 证书错误,微信支付,使用证书时出现58错误 - 微信公众平台
  19. oracle本地归档路径,oracle查看归档日志路径
  20. Docker--10张图带你深入理解Docker容器和镜像

热门文章

  1. 华为Q22机顶盒,刷机固件及教程(当贝桌面)
  2. 计算机专业期末试卷分析,计算机期末试卷分析
  3. linkedin第三方登陆
  4. Anylogic-----------集合Collection
  5. Can‘t resolve ‘core-js NPM 引入 core js 失败 解决
  6. 加载MNIST数据集
  7. java 学生签到考勤系统_学生考勤管理系统 用了ecplise编程实现Java+jsp+mysql数据库实现对学生的考勤管理签到和教师查看登陆注册以及一套完整的增删改查 - 下载 - 搜珍网...
  8. Java适合初学者的编写软件分享
  9. 刷机“变砖”,黑屏,自己通过以下方法再次让手机死而复生
  10. java学习软件_刚学习java,用哪些学习软件比较好?