归并排序,见名知意,就是递归+合并
原理:
使用递归的手段,达到分割的目的,在分割后进行合并,合并也是递归的,这就是这里的双向过程都是递归进行的,结果如图:

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

代码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));
}
}
本文深入解析归并排序的原理,通过递归分解与合并数组实现排序,并提供详细的Java代码示例,帮助读者理解这一高效排序算法。
&spm=1001.2101.3001.5002&articleId=83622959&d=1&t=3&u=ec5f6ec846164b46bf1fdeb8c4a2d86f)

被折叠的 条评论
为什么被折叠?



