归并排序复习

/**
     * 递归找中间节点下标并分组合并
     *
     * @param data 数组
     * @param low  起始下标
     * @param high 终点下标
     */
    public static void mergerSoertByPerson(int[] data, int low, int high) {
        if (low >= high) {
            return;
        }
        int mid = low + (high - low) / 2;// 计算中间值
        mergerSoertByPerson(data, low, mid); // 排序合并前半段数组
        mergerSoertByPerson(data, mid + 1, high);// 排序合并第二段数组
        mergeByPerson(data, low, mid, high); // 合并数组
    }

    /**
     * 合并两段数组中的数据
     *
     * @param data 数组
     * @param low  起始下标
     * @param mid  中间下标
     * @param high 终点下标
     */
    public static void mergeByPerson(int[] data, int low, int mid, int high) {
        int i = low;
        int j = mid + 1;
        int[] temp = new int[high - low + 1];
        int k = 0;
        while (i <= mid && j <= high) {// 比较两个数组的值进行排序,并且将其移动到第三个数组中
            if (data[i] <= data[j]) {
                temp[k++] = data[i++];
            } else {
                temp[k++] = data[j++];
            }
        }
        // 默认设置第一段数组未未移动完
        int start = i;
        int end = mid;
        if (j <= high) { // 判断第二段数组是否是否还有未移动完的数据
            start = j;
            end = high;
        }
        // 将剩余数组中的数据一定到临时数组中
        while (start <= end) {
            temp[k++] = data[start++];
        }
        // 将排序完的数组移回原数组中
        System.arraycopy(temp, 0, data, low, high - low + 1);

    }

    public static void main(String[] args) {

        int data[] = {4, 5, 8, 1, 2, 3, 6, 7, 10, 9, 11};
        mergerSoertByPerson(data, 0, 10);

        for (int i = 0; i < data.length; i++) {
            System.out.print(data[i] + "   ");
        }
        System.out.println();

    }

 结果如下:


Connected to the target VM, address: '127.0.0.1:49284', transport: 'socket'
1   2   3   4   0   0   6   0   0   0   0   
posted @ 2020-03-03 14:24  误入IT界的农民工  阅读(149)  评论(0编辑  收藏  举报