Java排序算法总结之归并排序

 更新时间:2015年05月19日 10:56:05   作者:一羽清宁  
这篇文章主要介绍了Java排序算法总结之归并排序,较为详细的分析了归并排序的原理与java实现技巧,需要的朋友可以参考下

本文实例讲述了Java排序算法总结之归并排序。分享给大家供大家参考。具体分析如下:

归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。和快速排序类似,让我们一起来看,归并在Java中的实现。

归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

归并排序算法稳定,数组需要O(n)的额外空间,链表需要O(log(n))的额外空间,时间复杂度为O(nlog(n)),算法不是自适应的,不需要对数据的随机读取。

工作原理:

1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
2、设定两个指针,最初位置分别为两个已经排序序列的起始位置
3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
4、重复步骤3直到某一指针达到序列尾
5、将另一序列剩下的所有元素直接复制到合并序列尾

代码实现:

////////////////
public void mergeSort(){
 long[] workSpace = new long[nElems];
 recMergeSort(workSpace,0,nElems-1);
}
private void recMergeSort(long[] workSpace,int lowerBound,int upperBound){
 if(lowerBound == upperBound){
  return;
 }
 else{
  int mid=(lowerBound+upperBound)/2;
  recMergeSort(workSpace, lowerBound, mid);
  recMergeSort(workSpace, mid+1, upperBound);
  merge(workSpace, lowerBound, mid+1, upperBound);
 }
}
private void merge(long[] workSpace,int lowPtr,int highPtr,int upperBound){
 int j = 0;
 int lowerBound = lowPtr;
 int mid = highPtr - 1;
 int n = upperBound-lowerBound+1;
 while(lowPtr<=mid&&highPtr<=upperBound){
  if(theArray[lowPtr]<theArray[highPtr]){
  workSpace[j++]=theArray[lowPtr++];
  }
  else{
  workSpace[j++]=theArray[highPtr++];
  }
 }
 while(lowPtr<=mid){
  workSpace[j++] = theArray[lowPtr++];
 }
 while(highPtr<=upperBound){
  workSpace[j++] = theArray[highPtr++];
 }
 for(j=0;j<n;j++){
  theArray[lowerBound+j]=workSpace[j];
 }
}

归并排序是比较稳定的排序.即相等的元素的顺序不会改变.如输入记录 1(1) 3(2) 2(3) 2(4) 5(5) (括号中是记录的关键字)时输出的 1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和 2 是按输入的顺序.这对要排序数据包含多个信息而要按其中的某一个信息排序,要求其它信息尽量按输入的顺序排列时很重要.这也是它比快速排序优势的地方.

希望本文所述对大家的java程序设计有所帮助。

相关文章

  • 详解SpringBoot Schedule配置

    详解SpringBoot Schedule配置

    本篇文章主要介绍了详解SpringBoot Schedule配置 ,可以实现定时任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java实现修改PDF文件MD5值且保持内容不变

    Java实现修改PDF文件MD5值且保持内容不变

    在某些场景中,我们可能需要改变PDF文件的MD5值,而又不希望改变文件的可视内容,本文详细介绍了如何实现这一目标,并提供了具体的Java实现示例,需要的可以参考下
    2023-10-10
  • SpringBoot实现图形验证码的操作方法

    SpringBoot实现图形验证码的操作方法

    随着安全性的要求越来越高,目前许多项目中都使用了验证码,验证码也有各种类型,如 图形验证码、短信验证码、邮件验证码、人脸识别等,本文给大家介绍SpringBoot实现图形验证码的方法,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • Java 深入浅出讲解泛型与包装类

    Java 深入浅出讲解泛型与包装类

    泛型是在Java SE 1.5引入的的新特性,本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法,本篇我们一起来学习泛型以及包装类
    2022-04-04
  • Springboot中yml文件没有叶子图标的解决

    Springboot中yml文件没有叶子图标的解决

    这篇文章主要介绍了Springboot中yml文件没有叶子图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java 关于eclipse导入项目发生的问题及解决方法(推荐)

    Java 关于eclipse导入项目发生的问题及解决方法(推荐)

    下面小编就为大家分享一篇Java 关于eclipse导入项目发生的问题及解决方法(推荐),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Go Java 算法之迷你语法分析器示例详解

    Go Java 算法之迷你语法分析器示例详解

    这篇文章主要为大家介绍了Go Java 算法之迷你语法分析器示例详解,
    有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 创建多模块项目的超详细教程

    IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 创建多模块项目的超详细教程

    这篇文章主要介绍了IDEA 2020.2 +Gradle 6.6.1 + Spring Boot 2.3.4 创建多模块项目的教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • SpringBoot如何通过devtools实现热部署

    SpringBoot如何通过devtools实现热部署

    这篇文章主要介绍了SpringBoot如何通过devtools实现热部署,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java实现纪元秒和本地日期时间互换的方法【经典实例】

    Java实现纪元秒和本地日期时间互换的方法【经典实例】

    这篇文章主要介绍了Java实现纪元秒和本地日期时间互换的方法,结合具体实例形式分析了Java日期时间相关操作技巧,需要的朋友可以参考下
    2017-04-04

最新评论