import java.util.Arrays;
/**
* @Author: A mao
* @Date: 2022/5/19 15:52
*/
public class Test02 {
public static void main(String[] args) {
//归并排序
int[] test = {4,7,2,9,10,12,6,5,13};
merge_sort(test,0,test.length-1);
System.out.println(Arrays.toString(test));
}
public static void merge_sort(int[] a,int left,int right){
if(left==right){
return;
}
int mid = (left+right)/2; //周到中点位置的下标 如果是奇数就是中间那一个 偶数是偏左边那一个
merge_sort(a,left,mid); //对左边进行排序
merge_sort(a,mid+1,right);//对右边进行排序
//左边右边排完序之后 对 a 数组的相应位置进归并 尝试去改变的位置是left - right
//注意其他地方还是原来的样子
//三指针
int[] temp = new int[a.length]; //创建一个临时数组 归并到这个临时数组中去
//归并的位置为 left到right 其他地方先不变
int newArr = left;// 新数组的指针先指向left
int leftPoint = left; //左指针指向left
int rightPoint = mid +1;//右指针指向 mid + 1
//开始比较
while(true){
if(a[leftPoint]<a[rightPoint]){
//如果左边比右边小
temp[newArr] = a[leftPoint];
leftPoint++;
newArr++;
if(leftPoint==mid+1){
//如果溢出了 就把右边的放入完就好了
for(int i=rightPoint;i<=right;i++){
temp[newArr] = a[rightPoint];
rightPoint++;
newArr++;
}
break;
}
}else{
temp[newArr] = a[rightPoint];
rightPoint++;
newArr++;
if(rightPoint==right+1){
//如果溢出了 就把左边的放入完就好了
for(int i=leftPoint;i<=mid;i++){
temp[newArr] = a[leftPoint];
leftPoint++;
newArr++;
}
break;
}
}
}
//现在已经归并完一次了
for(int i =left;i<=right;i++){
//把从 left 到 right的所有temp数组移动到 a
a[i]=temp[i];
}
}
}
