归并排序,也就是将一个数组无限次的对半拆分 一直拆分数量为1的时候 将两个数量为1的数组比较大小合并为有序的,再依次往上合并
如果班上有10个小学生{1, 5, 2, 6, 7, 3, 4, 8,9,10} 先将小学生分成2组,A组{1,5,2,6,7}和B组{3,4,8,9,10}
再将A组拆分为两组 A1组{1,5},A2组{2,6,7}
A1组再拆分为A11{1} A12{5} 将A11 和A12合并得出A1{1,5}
A2组拆分为A21{2},A22{6,7}
A22组拆分为A221{6} A222{7}
先合并A221 和A222 得出A22{6,7}
A21 和A22合并 得出A2{2,6,7}
A1和A2合并 得出A{1,2,5,6,7}
同理 B组归并之后为{3,4,8,9,10}
最后A组和B组合并 结果为{1,2,3,4,5,6,7,8,9,10}
讲一下怎么合并的 拿A组和B组归并来说
A组{1,2,5,6,7}
B组{3,4,8,9,10}
先建一个结果数组result 长度为A.length+B.length 长度为10
开始从A组和B组数字里找数字填入result
两个变量i 和j 分别表示数组A和B的索引
可能存在一种情况 如果i >=A.length 那就说明A组中的数组取完了 直接拿B的就好 同理j >=B.length 就说明B组中的数取完了
假设正常比较 那应该是比较 A[i]和B[j]的值哪个符合条件 如果A符合条件 那么result[index]=A[i] 赋值完后将i++ 下一次比较就从A组里的下一个元素开始
代码:
  public static int[] mergeSort(int[] array) {
        if (array.length < 2) {
            return array;
        }
        int mid = array.length / 2;
        int[] left = Arrays.copyOfRange(array, 0, mid);
        int[] right = Arrays.copyOfRange(array, mid, array.length);
        int[] int1 = mergeSort(left);
        int[] int2 = mergeSort(right);
        int[] merge = merge(int1, int2);
        return merge;
    }

    /**
     * 归并排序——将两段排序好的数组结合成一个排序数组
     *
     * @param left
     * @param right
     * @return
     */
    private static int[] merge(int[] left, int[] right) {
        int[] result = new int[left.length + right.length];
        for (int index = 0, i = 0, j = 0; index < result.length; index++) {
            if (i >= left.length) {
                result[index] = right[j++];
            } else if (j >= right.length) {
                result[index] = left[i++];
            } else if (left[i] > right[j]) {
                result[index] = right[j++];
            } else {
                result[index] = left[i++];
            }
        }

        return result;
    }

 



posted on 2020-05-15 17:28  Vinlen  阅读(157)  评论(0编辑  收藏  举报