//两个有序数组合并成一个总的有序数组
public static void merge(int[] data ,int left,int mid ,int right){
int[] tmp=new int[data.length];
int leftPoint=left;
int rightPoint=mid+1;
int loc=left;
//分别对两个有序数组的首元素进行比较,按从小到大排序的逻辑
while(leftPoint<=mid && rightPoint<=right){
if(data[leftPoint]<=data[rightPoint]){
//左有序数组的头元素比右边有序数组的头元素小
//将左有序数组的头元素赋值给临时数组
tmp[loc]=data[leftPoint];
//左边数组的下标往后移
leftPoint++;
//临时数组的下标后移
loc++;
}else{
//左有序数组的头元素比右边有序数组的头元素大
//将又有序数组的头元素赋值给临时数组
tmp[loc]=data[rightPoint];
//右边数组的下标往后移
rightPoint++;
//临时数组的下标后移
loc++;
}
}
//最后有可能两个有序数组其中一个并没有排完就跳出了循环
//此时补上剩余数组的剩余元素
while(leftPoint<=mid){
tmp[loc++]=data[leftPoint++];
}
while(rightPoint<=right){
tmp[loc++]=data[rightPoint++];
}
//将两个有序数组排好序的临时数组的结果赋给原数组
for(int i=left ;i<=right;i++){
data[i]=tmp[i];
}
}
//对数组进行二分递归
public static void mergeSort(int[] data,int left,int right){
if(left<right){
int mid=(right+left)/2;
mergeSort(data,left,mid);
mergeSort(data,mid+1,right);
merge(data,left,mid,right);
}
}
public static void main(String[] args) {
int[] a={8,9,6,5,4,7,1,3,2,0};
mergeSort(a,0,a.length-1);
System.out.println(Arrays.toString(a));
}