Java排序算法三之归并排序的递归与非递归的实现示例解析

 更新时间:2020年08月05日 16:54:25   作者:gavenyeah  
这篇文章主要介绍了Java排序算法三之归并排序的递归与非递归的实现示例解析,文章通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

归并有递归和非递归两种。

归并的思想是:
1.将原数组首先进行两个元素为一组的排序,然后合并为四个一组,八个一组,直至合并整个数组;
2.合并两个子数组的时候,需要借助一个临时数组,用来存放当前的归并后的两个数组;
3.将临时数组复制回原数组对应的位置。

非递归的代码如下:

package mergesort;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
//归并排序的非递归算法
public class MergeSort{
 public static void main(String args[]){
 MergeSort mer = new MergeSort();
 int[] array = mer.getArray();
 System.out.println("OriginalArray:" + Arrays.toString(array));
 mer.mergeSort(array);
 System.out.println("SortedArray:" + Arrays.toString(array));
 }
 public int[] getArray(){
 Scanner cin = new Scanner(System.in);
 System.out.print("Input the length of Array:");
 int length = cin.nextInt();
 int[] arr = new int[length];
 Random r = new Random();
 for(int i = 0; i < length; i++){
  arr[i] = r.nextInt(100);
 }
 cin.close();
 return arr;
 }
 public void mergeSort(int[] a){
 int len = 1;
 while(len < a.length){
  for(int i = 0; i < a.length; i += 2*len){
  merge(a, i, len);
  }
  len *= 2;
 }
 }

 public void merge(int[] a, int i, int len){
 int start = i;
 int len_i = i + len;//归并的前半部分数组
 int j = i + len;
 int len_j = j +len;//归并的后半部分数组
 int[] temp = new int[2*len];
 int count = 0;
 while(i < len_i && j < len_j && j < a.length){
  if(a[i] <= a[j]){
  temp[count++] = a[i++];
  }
  else{
  temp[count++] = a[j++];
  }
 }
 while(i < len_i && i < a.length){//注意:这里i也有可能超过数组长度
  temp[count++] = a[i++];
 }
 while(j < len_j && j < a.length){
  temp[count++] = a[j++];
 }
 count = 0;
 while(start < j && start < a.length){
  a[start++] = temp[count++];
 }
 }
}

递归算法的实现代码如下:

package mergesort;

public class MergeSort {
 public static void mergeSort(int[] data,int left,int right){ //left,right均为数字元素下标
 if(left<right){
  int half=(left+right)/2;
  mergeSort(data,left,half);
  mergeSort(data,half+1,right);
  merge(data,left,right);
 }
 }
 public static void merge(int []a,int l,int h){
 int mid=(l+h)/2;
 int i=l;
 int j=mid+1;
 int count=0;
 int temp[]=new int[h-l+1];
 while(i<=mid&&j<=h){
  if(a[i]<a[j]){
  temp[count++]=a[i++];
  }else{
  temp[count++]=a[j++];
  } 
 }
 while(i<=mid){
  temp[count++]=a[i++];
 }
 while(j<=h){
  temp[count++]=a[j++];
 }
 count=0;
 while(l<=h){
  a[l++]=temp[count++];
 }
 }
 public static void printArray(int arr[]){
 for(int k=0;k<arr.length;k++){
  System.out.print(arr[k]+"\t");
 }
 }
 public static int[] getArray(){
// int[] data={4,2,3,1};
 int[] data={543,23,45,65,76,1,456,7,77,88,3,9};
 return data;
 }

 public static void main(String args[]){
 int[]a=getArray();
 System.out.print("数组排序前:");
 printArray(a);
 System.out.print("\n");
 mergeSort(a,0,a.length-1);
 System.out.print("归并排序后:");
 printArray(a);
 }
}

归并排序的时间复杂度为O(n*log2n),空间复杂度为O(n)

归并排序是一种稳定的排序方法。

到此这篇关于Java排序算法三之归并排序的递归与非递归的实现示例解析的文章就介绍到这了,更多相关Java排序算法之归并排序的递归与非递归内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现生成Excel树形表头完整代码示例

    Java实现生成Excel树形表头完整代码示例

    这篇文章主要介绍了Java实现生成Excel树形表头完整代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 如何避免Apache Beanutils属性copy

    如何避免Apache Beanutils属性copy

    这篇文章主要为大家介绍了如何避免Apache Beanutils属性copy的分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • JMETER用户变量作用域测试流程

    JMETER用户变量作用域测试流程

    这篇文章主要介绍了JMETER用户变量作用域测试流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 新手入门Jvm--Jvm垃圾回收

    新手入门Jvm--Jvm垃圾回收

    JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的
    2021-06-06
  • Java使用poi做加自定义注解实现对象与Excel相互转换

    Java使用poi做加自定义注解实现对象与Excel相互转换

    这篇文章主要介绍了Java使用poi做加自定义注解实现对象与Excel相互转换,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • java分布式面试降级组件Hystrix的功能特性

    java分布式面试降级组件Hystrix的功能特性

    这篇文章主要为大家介绍了java分布式面试关于降级组件Hystrix的功能特性回答,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • spring cloud gateway跨域全局CORS配置方式

    spring cloud gateway跨域全局CORS配置方式

    这篇文章主要介绍了spring cloud gateway跨域全局CORS配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java SpringBoot模板引擎之 Thymeleaf入门详解

    Java SpringBoot模板引擎之 Thymeleaf入门详解

    jsp有着强大的功能,能查出一些数据转发到JSP页面以后,我们可以用jsp轻松实现数据的显示及交互等,包括能写Java代码。但是,SpringBoot首先是以jar的方式,不是war;其次我们的tomcat是嵌入式的,所以现在默认不支持jsp
    2021-10-10
  • Java8新日期时间API的20个使用示例

    Java8新日期时间API的20个使用示例

    这篇文章主要介绍了Java8新日期时间API的20个使用示例,为了学习Java 8的这个新库,这里我创建了20个以任务为导向的例子,需要的朋友可以参考下
    2015-03-03
  • Spring中@Configuration注解和@Component注解的区别详解

    Spring中@Configuration注解和@Component注解的区别详解

    这篇文章主要介绍了Spring中@Configuration注解和@Component注解的区别详解,@Configuration 和 @Component 到底有何区别呢?我先通过如下一个案例,在不分析源码的情况下,小伙伴们先来直观感受一下这两个之间的区别,需要的朋友可以参考下
    2023-09-09

最新评论