/** *@Description: 归并排序: * 假设初始序列含有n个记录,则可以看成是n个有序子序列,每个子序列的长度为1, * 然后两两归并,的到[n/2]([x]表示不小于x的最小整数)个长度为2或者为1的有序子序列, * 再两两归并,如此重复,直到得到一个长度为n的有序序列为止,这种方法被称为2路归并排序 *@Author: lizhouwei *@CreateDate: 2018/6/23 16:11 * @Modified By: */public class MergeSort { public static void mergeSort(Integer[] arr) { if (arr == null || arr.length == 0) { return; } SortUtil.printArray("归并排序前", arr); Integer[] res = new Integer[arr.length]; merge(arr, 0, arr.length - 1, res); SortUtil.printArray("归并排序后", arr); } private static void merge(Integer[] arr, int left, int right, Integer[] res) { if (left >= right) { return; } int mid = (left + right) / 2; merge(arr, left, mid, res); merge(arr, mid + 1, right, res); int resleft = left; int resright = mid + 1; int resK = left; while (resleft <= mid && resright <= right) { if (arr[resleft] < arr[resright]) { res[resK++] = arr[resleft++]; } else { res[resK++] = arr[resright++]; } } while (resleft <= mid) { res[resK++] = arr[resleft++]; } while (resright <= right) { res[resK++] = arr[resright++]; } while (--resK >= 0) { arr[resK] = res[resK]; } }}