归并排序执行流程:
public class MergeSort { public static void main(String[] args) { int arr[]={2,3,4,0,3,5,15,23}; mergeSort(arr,0,arr.length-1); System.out.println(Arrays.toString(arr)); } public static void mergeSort(int []arr,int L,int R) { if (L==R) return; int mid=(L+R)/2; //处理左边 mergeSort(arr,L,mid); //处理右边 mergeSort(arr,mid+1,R); //归并 merge(arr,L,mid,R); } public static void merge(int []arr,int L,int mid,int R) { //用于存储归并后的临时数组 int temp[]=new int[R-L+1]; //记录第一个数组中需要遍历的下标 int i=L; //记录第二个数组中需要遍历的下标 int j=mid+1; //用于记录在临时数组中存放的下标 int inedx=0; //遍历两个数组去除小的放入临时数组 while (i<=mid&&j<=R) { temp[inedx++]=arr[i]<arr[j]?arr[i++]:arr[j++]; // if (arr[i]<=arr[j]) // { // //将小的数放入临时数组 // temp[inedx]=arr[i]; // //下标向后移动 // i++; // }else { // //将小的数放入临时数组 // temp[inedx]=arr[j]; // //下标向后移动 // j++; // } // //移动临时数组下标; // inedx++; } //处理第二个数组多余的情况 while (j<=R) { temp[inedx++]=arr[j++]; } //处理第一个数组多余的情况 while (i<=mid) { temp[inedx++]=arr[i++]; } //将临时数组中的数组重新存入原数组 for (int k=0;k<temp.length;k++) { arr[L+k]=temp[k]; } } }