归并排序的java实现(超详解)

本文深入解析归并排序的原理,通过递归分解与合并数组实现排序,并提供详细的Java代码示例,帮助读者理解这一高效排序算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

归并排序,见名知意,就是递归+合并

原理:

使用递归的手段,达到分割的目的,在分割后进行合并,合并也是递归的,这就是这里的双向过程都是递归进行的,结果如图:

示例(实例):

以一下一串数字为例,首先进行拆分,然后合并,在合并的过程,进行排序,这里需要说明的是,递归在整个过程中都是存在的,不是单单拆分和合并存在递归。特别是在合并的过程中的排序不是那么简单,在采用专门合并两个有序数组的方式进行合并排序,后面把代码贴出来,怎么能够保证我们需要排序的两个数组是有序的呢?这里就特别巧妙的运用递归进行拆分,拆分到最小单位时的数组肯定能够保证是有序的,特别巧妙,而且排序的过程仔细就回发现,如果给出的不是有序数组,那么不能保证排序的结果是真正有序的,过程看不懂没有关系,看下代码就能明白。

 

代码1(这个代码是粘的这篇博客的:https://blog.csdn.net/u014672511/article/details/80593436):

package order;

import java.util.Arrays;

public class merge2Arr {
	public static int[] merge2Arr(int[] arr1, int[] arr2) {
		  int len1 = arr1.length;
		  int len2 = arr2.length;
		  int[] res = new int[len1 + len2];  
		  int i = 0, j = 0, k = 0;
		  while(i < len1 && j < len2) {
		    res[k++] = arr1[i] < arr2[j]? arr1[i++] : arr2[j++];
		  }
		  while(i < len1) {
		    res[k++] = arr1[i++];
		  }
		  while(j < len2) {
		    res[k++] = arr2[j++];
		  }
		  return res;
		}
	
	
	public static void main(String[] args) {
		int[] arr1= {1,4,76,5,3}; 
		int[] arr2={5,66,76,3,9};
		int[] aaa=merge2Arr(arr1, arr2);
		System.out.println(Arrays.toString(aaa));
	}
	
	
}

 归并排序的全代码:

package order;
import java.util.Arrays;
public class _merge2 {
	public static void merge(int[] a, int low,int mid,int high) {
		 
		 //建立左右两个数组
		 int[] L=new int[mid-low+1];
		 int[] R=new int[high-mid];
		 //给左右数组赋值
		 int i1,j1;
		 for (i1= 0,j1=low; i1< L.length; i1++) 
		     L[i1]=a[j1++];
		 int i2,j2;
		 for (i2= 0,j2=mid+1; i2< R.length; i2++) 
		     R[i2]=a[j2++];
		//拿来放临时数据
		 int[] temp=new int[high-low+1];
		 int i3=0;
		 int j3=0;
		 int k1=0;
		while (i3<L.length&&j3<R.length) {
			if (L[i3]<R[j3]) {
				temp[k1++]=L[i3++];
			}else {
				temp[k1++]=R[j3++];
			}
		}
		//放剩下未放完的左数据(此时右数据已经放完)
		if (i3<mid-low+1&&j3>=high-mid) {
			for (int j5= i3; j5 <mid-low+1; j5++,k1++) {
				temp[k1]=L[j5];
			}
		}
		
		//放剩下未放完的右数据(此时左数据已经放完)
		if (j3<high-mid&&i3>=mid-low+1) {
			for (int i5= j3; i5 <high-mid; i5++,k1++) {
				temp[k1]=R[i5];
			}
		}
		if (k1<=high ) {
			for (int j4 = 0; j4 < temp.length; j4++) {
				a[j4]=temp[j4];
			}
			
		}
		
	}
	
	public static void mergeSort(int[] a,int lo,int hig) {
		if (lo<hig) {
			int mid=(hig+lo)/2;
			int[] Le=new int[mid+1];
			int[] Ri=new int[hig-mid];
			mergeSort(Le,lo,mid); 
			mergeSort(Ri,mid+1,hig);
			merge(a, lo, mid, hig);
		}
	}
	//测试一下
	public static void main(String[] args) {
		int[] aa= {22,5,3,3,8,3,0,5,6,11};
		mergeSort(aa,0,aa.length-1);
		System.out.println(Arrays.toString(aa));
	}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值