import java.util.Arrays;
public class Merge {
public static void main(String[] args) {
int arr[]=new int[]{9,5,3,7,2,1,6,4,8};
merge(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
//递归函数 传入数组,数组左边,数组右边
public static void merge(int arr[],int left,int right) {
//当数组左==数组右时,成为递归出口,返回。
if(left==right) {
return;
}
//定义中间mid
int mid=(left+right)/2;
//递归左边
merge(arr,left,mid);
//递归右边
merge(arr,mid+1,right);
//调用函数sort进行排序
sort(arr,left,right,mid);
}
public static void sort(int arr[],int left,int right,int mid) {
//创建当前递归的数组temp,用来存临时数据
int[] temp=new int[right-left+1];
//temp数组的坐标
int index=0;
//s1为左边数组的坐标
int s1=left;
//s2为右边数组的坐标
int s2=mid+1;
//如果s1和s2都小于自己的边界,代表两个临时数组还能够比较
while(s1<=mid&&s2<=right) {
//如果s1的值更小,让s1处加入临时数组
if(arr[s1]<arr[s2]) {
temp[index]=arr[s1];
//临时数组下标+1;s1游标+1
index++;
s1++;
//如果s2的值更小,让s2处加入临时数组
}else {
temp[index]=arr[s2];
//临时数组下标+1;s2游标+1
index++;
s2++;
}
}
//如果s1的值小于mid,左边游标未遍历完,需要将剩下的数据存入temp临时数组
while(s1<=mid) {
temp[index]=arr[s1];
index++;
s1++;
}
//如果s2的值小于right,左边游标未遍历完,需要将剩下的数据存入temp临时数组
while(s2<=right){
temp[index]=arr[s2];
index++;
s2++;
}
//遍历临时数组,将临时数组排好顺序的值放回arr数组
for(int i=0;i<temp.length;i++) {
//考虑到递归时两边数组的left不一样
arr[i+left]=temp[i];
}
}
}
08-03
1293
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
07-07
303
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
09-04
167
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
12-07
2488
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
06-30
4860
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
04-19
1261
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
07-17
3万+
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-28