归并排序

前两天写了4个排序 今天弄明白了一个稍微复杂点的排序算法、

归并排序

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

简单理解
归并排序就是把一个数组通过递归的方式 不断的从中间拆分,直到不可再分为止(分);
然后开始合并 边合并边排序 返回合并后的子数组 直到数组排序完成(治)。

演示图片 (菜鸟)

代码如下

//归并排序
    public int[] mergesort(int[] sourceArray) {
        // 对 arr 进行拷贝,不改变参数内容
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
        //当数组长度不可再分 结束
        if (arr.length < 2) {
            return arr;
        }
        //将数组拆分成两份 一个left 一个right
        int middle = (int) Math.floor(arr.length / 2);
        int[] left = Arrays.copyOfRange(arr, 0, middle);
        int[] right = Arrays.copyOfRange(arr, middle, arr.length);
        //递归拆分数组 直到不可再分
        return merge(mergesort(left), mergesort(right));
    }
    //归并方法
    int[] merge(int[] left, int[] right) {
        //新建一个空间 用于保存两个数组
        int[] result = new int[left.length + right.length];
        int i = 0;
        while (left.length > 0 && right.length > 0) {
            if (left[0] <= right[0]) {
                result[i++] = left[0];
                left = Arrays.copyOfRange(left, 1, left.length);
            } else {
                result[i++] = right[0];
                right = Arrays.copyOfRange(right, 1, right.length);
            }
        }
        while (left.length > 0) {
            result[i++] = left[0];
            left = Arrays.copyOfRange(left, 1, left.length);
        }
        while (right.length > 0) {
            result[i++] = right[0];
            right = Arrays.copyOfRange(right, 1, right.length);
        }
        return result;
    }

posted @ 2022-07-04 22:40  Cloong  阅读(35)  评论(0)    收藏  举报