归并排序 递归实现

import java.util.Arrays;/** * 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 * 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 * 归并排序是一种稳定的排序方法。 * <p> * 递归实现 */public class MergeSort {    public static void main(String[] args) {        // 测试次数        int times = 50000;        int maxNum = 100;        int maxSize = 100;        for (int i = 0; i < times; i++) {            // 生成随机数组            int[] arr1 = generateArray(maxNum, maxSize);            // 复制            int[] arr2 = copyArray(arr1);            // 归并排序            mergeSort(arr1);            // Api排序            Arrays.sort(arr2);            // 比较排序结果            if (!arrayEquals(arr1, arr2)) {                System.out.println("Sort failed!!!");                System.out.println(Arrays.toString(arr1));                System.out.println(Arrays.toString(arr2));                return;            }        }        System.out.println("Sort success");    }    public static void mergeSort(int[] arr) {        if (arr == null || arr.length < 2) {            return;        }        sort(arr, 0, arr.length - 1);    }    public static void sort(int[] arr, int left, int right) {        if (left == right) {            return;        }        int mid = left + ((right - left) >> 1);        sort(arr, left, mid);        sort(arr, mid + 1, right);        merge(arr, left, mid, right);    }    public static void merge(int[] arr, int left, int mid, int right) {        int[] help = new int[right - left + 1];        int index = 0;        int po1 = left;        int po2 = mid + 1;        while (po1 <= mid && po2 <= right) {            help[index++] = arr[po1] < arr[po2] ? arr[po1++] : arr[po2++];        }        while (po1 <= mid) {            help[index++] = arr[po1++];        }        while (po2 <= right) {            help[index++] = arr[po2++];        }        for (int i = left, j = 0; i <= right; ) {            arr[i++] = help[j++];        }    }    /**     * 生成随机数组     *     * @param maxNum  最大数     * @param maxSize 数组最大大小     * @return 随机数组     */    private static int[] generateArray(int maxNum, int maxSize) {        int[] arr = new int[(int) (maxSize * Math.random())];        for (int i = 0; i < arr.length; i++) {            arr[i] = (int) (maxNum * Math.random()) - (int) (maxNum * Math.random());        }        return arr;    }    /**     * 复制数组     *     * @param arr 要复制的数组     * @return 复制的数组     */    private static int[] copyArray(int[] arr) {        if (arr == null) {            return null;        }        int[] copy = new int[arr.length];        for (int i = 0; i < arr.length; i++) {            copy[i] = arr[i];        }        return copy;    }    /**     * 判断两数组是否完全相同     *     * @param arr1 数组1     * @param arr2 数组2     * @return 是否相同     */    private static boolean arrayEquals(int[] arr1, int[] arr2) {        if (arr1 == arr2) {            return true;        }        if (arr1 == null || arr2 == null || arr1.length != arr2.length) {            return false;        }        for (int i = 0; i < arr1.length; i++) {            if (arr1[i] != arr2[i]) {                return false;            }        }        return true;    }}/* 如有错误,欢迎批评指正 */