public class MergeSort {
public static void main(String[] args) {
int[] arr = new int[]{5,9,2,4,6,8,7,1,3};
mergeSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void mergeSort(int[] arr,int low,int high){
int middle = (high+low)/2;
if (low<high){
//处理右边
mergeSort(arr,low,middle);
//处理左边
mergeSort(arr,middle+1,high);
//归并
merge(arr,low,middle,high);
}
}
public static void merge(int[] arr,int low,int middle,int high){
//创建临时数组用于存储归并后的数组
int[] temp = new int[high-low+1];
//记录第一个数组需要遍历的下标
int i = low;
//记录第二个数组需要遍历的下标
int j = middle+1;
//记录临时数组的的下标
int index = 0;
//遍历两个数组取出小的数组存入到临时数组当中
while (i<=middle&&j<=high){
//第一个数组的数更小
if (arr[i]<=arr[j]){
temp[index] = arr[i];
i++;
}else {//第二个数组的数更小
temp[index] = arr[j];
j++;
}
index++;
}
//处理多余的数据
while (j<=high){
temp[index] = arr[j];
j++;
index++;
}
while (i<=middle){
temp[index] = arr[i];
i++;
index++;
}
//将临时数组存到原数组中
for (int k=0;k<temp.length;k++){
arr[k+low] = temp[k];
}
}
}