• 排序算法之归并排序


    参考:https://www.runoob.com/w3cnote_genre/algorithm

    归并排序

    申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
    设定两个指针,最初位置分别为两个已经排序序列的起始位置;
    比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
    重复步骤 3 直到某一指针达到序列尾;
    将另一序列剩下的所有元素直接复制到合并序列尾。

    1、判断:如果数组长度小于2则直接返回数组,不满足则向下执行
    2、声明一个变量middle,为数组长度除以2下下取整
    3、声明一个数组left,赋值为数组下标从0到middle的元素
    4、声明一个数组right,赋值为数组下标从middle到数组长度
    5、调用merge方法,参数为两个sort方法参数分别为left和right的返回值。

    
    public int[] sort(int[] sourceArray) throws Exception {
        // 对 arr 进行拷贝,不改变参数内容
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
    
        if (arr.length < 2) {
            return arr;
        }
        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(sort(left), sort(right));
    }
    
    protected 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;
    }
    
  • 相关阅读:
    第 7 章 Neutron
    第 7 章 Neutron
    第 7 章 Neutron
    第 7 章 Neutron
    第 7 章 Neutron
    第 7 章 Neutron
    第 7 章 Neutron
    第 7 章 Neutron
    第 7 章 Neutron
    iOS 屏幕旋转 nav+tabbar+present(网页) 2016
  • 原文地址:https://www.cnblogs.com/heibaimao123/p/13778649.html
Copyright © 2020-2023  润新知