归并排序-数组版

public static void main(String[] args) {
        int[] arr = {1, 5, 3, 8, 6, 4};
        //mergeSortedArrs(arr, 0, 3, 8);
        guiBing(arr, 0 , arr.length - 1);
        Arrays.stream(arr).forEach(System.out::println);
    }

    public static void guiBing(int[] arr, int leftIdx, int rightIdx) {
        if (leftIdx >= rightIdx) {
            //数组只有1个元素或没有元素,不需要排序
            return;
        }
        //数组只有两个元素,需要排序
        int middleIdx = (leftIdx + rightIdx) / 2;
        guiBing(arr, leftIdx, middleIdx);
        //如果middleIdx不加1,会死循环。(0 + 1)/2 = 0  => [0,0]&[0,1]
        //middle + 1 :(0 + 1)/2 = 0  => [0,0]&[1,1]
        guiBing(arr, middleIdx + 1, rightIdx);
        mergeSortedArrs(arr, leftIdx, middleIdx, rightIdx);
    }

    /**
     * 在原数组上合并:[leftIdx,middleIdx] & [middleIdx+1, rightIdx]
     */
    public static void mergeSortedArrs(int[] arr, int leftIdx, int middleIdx, int rightIdx) {
        int[] tmpArr = new int[rightIdx - leftIdx + 1];
        int idx1 = leftIdx, idx2 = middleIdx + 1, idx3 = 0;
        while (idx1 <= middleIdx && idx2 <= rightIdx) {
            if (arr[idx1] <= arr[idx2]) {
                tmpArr[idx3++] = arr[idx1++];
            } else {
                tmpArr[idx3++] = arr[idx2++];
            }
        }
        //上边跑完了一个数组,把另一个数组的剩余元素拷贝到mergeArr
        while (idx2 <= rightIdx) {
            tmpArr[idx3++] = arr[idx2++];
        }
        while (idx1 <= middleIdx) {
            tmpArr[idx3++] = arr[idx1++];
        }
        //把tmpArr的数据拷贝到原数组arr上
        idx3 = 0;
        while (leftIdx <= rightIdx) {
            arr[leftIdx++] = tmpArr[idx3++];
        }
    }

    /**
     * 合并两个新数组
     */
    public static int[] mergeSortedArrs(int[] arr1, int[] arr2) {
        int[] mergeArr = new int[arr1.length + arr2.length];
        int idx1 = 0, idx2 = 0, idx3 = 0;
        while (idx1 < arr1.length && idx2 < arr2.length) {
            if (arr1[idx1] <= arr2[idx2]) {
                mergeArr[idx3++] = arr1[idx1++];
            } else {
                mergeArr[idx3++] = arr2[idx2++];
            }
        }
        //上边跑完了一个数组,把另一个数组的剩余元素拷贝到mergeArr
        while (idx2 < arr2.length) {
            mergeArr[idx3++] = arr2[idx2++];
        }
        while (idx1 < arr1.length) {
            mergeArr[idx3++] = arr1[idx1++];
        }
        return mergeArr;
    }

    public static void swap(int[] arr, int idx1, int idx2) {
        int tmp = arr[idx1];
        arr[idx1] = arr[idx2];
        arr[idx2] = tmp;
    }

你可能感兴趣的:(归并排序-数组版)