import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr={1,2,4,6,3};
int temp[]=new int[arr.length];
mergeSort(arr,0,arr.length-1, temp);
System.out.println(Arrays.toString(arr));
}
//分+合的方法
private static void mergeSort(int[] arr,int left,int right,int[] temp){
if(left<right){
//向左递归进行分解
int mid=(left+right)/2;
mergeSort(arr,0,mid,temp);
//向右递归进行分解
mergeSort(arr,mid+1,right,temp);
//合并的方法
merge(arr,left,mid,right,temp);
}
}
//合并的方法
private static void merge(int[] arr,int left,int mid,int right,int[] temp){
int i=left;//左边有序数组的初始索引
int j=mid+1;//右边有序数组的初始索引
int t=0;//做中转的数组
//将左右两边的数组填充到temp数组,直到左右两边的有序序列有一边处理完毕
while(i<=mid && j<=right){
if(arr[i]<=arr[j]){
//如果左边的有序序列当前的元素小于等于右边的元素,将左边的元素填充到temp数组,相应的索引进1
temp[t]=arr[i];
t+=1;
i+=1;
}else{
//反之右边的有序序列当前的元素小于左边的元素,将右边的元素填充到temp数组,相应的索引进1
temp[t]=arr[j];
t+=1;
j+=1;
}
}
//将剩余一边的元素依次填充到temp
while(i<=mid){//左边元素有剩余
temp[t]=arr[i];
t+=1;
i+=1;
}
while(j<=right){//右边元素有剩余
temp[t]=arr[j];
t+=1;
j+=1;
}
//将temp数组拷贝到arr
//注意:并不是每次都拷贝所有
t=0;
int templeft=left;
while(templeft<=right){
arr[templeft]=temp[t];
t+=1;
templeft+=1;
}
}
}