package Sort; import java.util.Arrays; /** * @author lxy * @version 1.0 * @date 2020/10/10 20:51 */ public class MergeSort { public static void main(String[] args) { int[] arr = new int[]{1,13,24,26,2,15,27,38,16,-1};//int mid = (arr.length -1)/2;int[] temp = new int[arr.length];//MergeSort.merge(arr,temp,0, mid+1,arr.length-1);MergeSort.mergeSort(arr,temp,0, arr.length-1); System.out.println(Arrays.toString(arr)); } public static void mergeSort(int[] arr,int[] temp ,int left ,int right){ if (left<right){ int center = (left+right)/2; //递归对第一部分进行排序 mergeSort(arr,temp,left,center); //递归对第二部分进行排序 mergeSort(arr,temp,center+1,right); //合并 merge(arr,temp,left,center+1,right); } } /** * 归并排序分析 * @param arr : 传入的数组 * @param temparr : 临时数组;存储临时数组值 * @param leftstart : 左半部分(第一部分)初始化索引 * @param rightEnd : 数组结尾 * @param rightStart :第二部分开始 */ public static void merge(int[] arr ,int[] temparr , int leftstart ,int rightStart,int rightEnd){ int leftEnd = rightStart-1; int tempStart = leftstart; while (leftstart<=leftEnd&&rightStart<=rightEnd){ //第一部分的某个值小于第二部分某个值;则将第一部分中的值放入临时数组;并将第一部分下标+1 if (arr[leftstart]<arr[rightStart]){ temparr[tempStart++] = arr[leftstart++]; } //第二部分的某个值小于第一部分某个值;则将第二部分中的值放入临时数组;并将第二部分下标+1 else if (arr[leftstart]>arr[rightStart]){ temparr[tempStart++] = arr[rightStart++]; } } //如果第一部分有剩余的值;则将剩余值依次放入临时数组 while(leftstart<=leftEnd){ temparr[tempStart++] = arr[leftstart++]; } //如果第二部分有剩余的值;则将剩余值依次放入临时数组 while(rightStart<=rightEnd){ temparr[tempStart++] = arr[rightStart++]; } int t=0; int T=0; //将临时数组复制到原始数组 while (T <=rightEnd){ arr[T] = temparr[t]; T+=1; t+=1; } } }