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]; } } }