图解:
代码:
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] arr = {2,4,5,7,1,2,3,6,3};
MergeSortFun(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void MergeSortFun(int[] arr,int l,int r){
if(l<r){
int mid = (l+r)/2;//求中间值
MergeSortFun (arr,l,mid);
MergeSortFun(arr,mid+1,r);
Merge(arr,l,mid,r);
}
}
//归并程序
public static void Merge(int[] arr,int l,int mid,int r){
int n1 = mid - l +1;
int n2 = r - mid;
//分解成两个新数组,用来存放左边和右边的内容
int[] L = new int[n1];
int[] R = new int[n2];
for(int i=0;i<n1;i++){
L[i] = arr[l+i];
}
for(int i=0;i<n2;i++){
R[i] = arr[mid+1+i];
}
int i = 0;
int j = 0;
for(int k=l;k<r;k++){
if(L[i]<=R[j]){
arr[k] = L[i];
if(i==L.length-1){
while(j<R.length){//一旦发现分解的数组中有一方已经全部复制进arr,那么久将另外一个数组直接追加复制在arr后面
k++;
arr[k] = R[j];
j++;
}
}
i++;
}else{
arr[k] = R[j];
if(j==R.length-1){
while(i<L.length){
k++;
arr[k] = L[i];
i++;
}
}
j++;
}
}
}
}