public static int[] mergeSort(int[] arr, int left,int right) { if (left < right){ // 取分割位置 int middle = (left + right) / 2; // 递归划分数组左序列 mergeSort(arr, left, middle); // 递归划分数组右序列 mergeSort(arr, middle+1, right); //将左数组和右数组进行归并 merge(arr, left, middle, right); } return arr; } private static void merge(int[] arr, int left, int middle,int right) { int[] tempArray = new int[arr.length]; int leftEnd = middle; int rightStart = middle+1; // 临时数组的下标 int tempIndex = left; int tmp = left; // 先循环两个区间段都没有结束的情况 while ((left <= leftEnd) && (rightStart <= right)){ // 左边的比右边的小,先插入左边的 if (arr[left] < arr[rightStart]){ tempArray[tempIndex++] = arr[left++]; }else{ tempArray[tempIndex++] = arr[rightStart++]; } } // 判断左序列是否结束 while (left <= leftEnd){ tempArray[tempIndex++] = arr[left++]; } // 判断右序列是否结束 while (rightStart <= right){ tempArray[tempIndex++] = arr[rightStart++]; } // 将临时数组中的内容拷贝回原数组中 // (原left-right范围的内容被复制回原数组) while (tmp <= right) { arr[tmp] = tempArray[tmp++]; } }