0
点赞
收藏
分享

微信扫一扫

归并排序实现与类似题目

Raow1 2022-03-11 阅读 21

归并排序

主要思想

  1. 分治的思想,数组分为2部分,左右分别排好序。
  2. 主要是merge思想

相关题目

  1. 求逆序对
  2. 求数组的小和

代码实现

  @Test
    public void test() {
        int arr[] = new int[]{10, 2, 5, 6};
        mergeSort(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    public void mergeSort(int arr[]) {

        if (arr.length == 1 ) {
            return;
        }
        sort(arr, 0, arr.length-1);

    }

    private void sort(int[] arr, int begin, int end) {

        if (end == begin) {
            return;
        }
        int middle = begin + ((end - begin) >> 1);
        sort(arr, begin, middle);
        sort(arr, middle + 1, end);
        merge(arr, begin, middle, end);
    }
     /**
     * 合并的过程
     * 考虑边界调价
     * begin   0
     * middle 0
     * end    1
     *  0,1
     * [2,5]
     * 1 3 5
     * 1. 辅助数组的长度 : 如果数值为 0,0 ,1 需要调整的范围是0-1 size=2 故 1-0+1
     * 2. while 边界:考虑 如条件一  第一次是需要比较的 也要进入第一个循环 同理  0,1,2 middle =1 rightStart=2 也是需要进行第一次比较
     * 3. 后面的边界:辅助数组为 2,跳出第一个while,此时,leftStart 符合条件进入
     *              辅助数组为 1 3  右侧 rightStart =end 需要拷贝
     *
     * @param arr
     * @param begin
     * @param middle
     * @param end
     */
    private void merge(int[] arr, int begin, int middle, int end) {

        int leftStart = begin;
        int rightStart = middle + 1;
        int helpIndex = 0;
        int[] help = new int[end - begin + 1];
        while (leftStart <= middle && rightStart <= end) {
            help[helpIndex++] = arr[leftStart] <= arr[rightStart] ? arr[leftStart++] : arr[rightStart++];
        }
        while (leftStart <= middle) {
            help[helpIndex++] = arr[leftStart++];
        }
        while (rightStart <= end) {
            help[helpIndex++] = arr[rightStart++];
        }
        for (int i = 0; i < help.length; i++) {
            arr[begin + i] = help[i];
        }
    }
举报

相关推荐

0 条评论