美文网首页
归并排序【算法导论】

归并排序【算法导论】

作者: 比轩 | 来源:发表于2019-11-13 21:38 被阅读0次

注:学习算法导论,按照标准伪代码理解翻译为java实现,如有兴趣理解整个过程的细节,建议阅读《算法导论》第二章:2.3 设计算法。

/**
 * 归并排序,直接通过修改原数组实现结果输出
 * @param arr 原始数组
 * @param p arr起始点下标,首次调用为: {@code 0}
 * @param r arr结束点下标,首次调用为: {@code arr.length - 1}
 */
void  mergeSort(int[] arr, int p, int r) {
    if (p < r) {
        // 计算q,分组
        int q = (p + r) / 2;
        // 排序左边
        mergeSort(arr, p, q);
        // 排序右边
        mergeSort(arr,q + 1, r);
        // 合并左右结果
        merge(arr, p, q, r);
    }
}

/**
 * mege实现
 * @param arr 原始数组
 * @param p 当前Left分组的起始点下标
 * @param q 当前中间节点下标
 * @param r 当前Right分组的结束点下标
 */
void merge(int[] arr, int p, int q, int r) {
    // 在标准实现的基础上外加了一段判断逻辑,避免一直申请内存
    // 当p到r的距离为2时,直接比较大小,交换位置即可
    if (r - p == 1) {
        if (arr[r] >= arr[q]) return;
        arr[p] = arr[p] + arr[r];
        arr[r] = arr[p] - arr[r];
        arr[p] = arr[p] - arr[r];
        // 打印每一次merge的结果
        System.out.println(Arrays.toString(arr));
        return;
    }
    // 计算两个分组的长度
    int n1 = q - p + 1;
    int n2 = r - q;
    // 复制原数组对应端的数据到两个新的分组
    int[] lArr = new int[n1 + 1];
    int[] rArr = new int[n2 + 1];
    int i;
    for (i = 0; i < n1; i++) {
        lArr[i] = arr[i + p];
    }
    // max 代表书中的无限大
    lArr[i] = Integer.MAX_VALUE;
    for (i = 0; i < n2; i++) {
        rArr[i] = arr[i + q + 1];
    }
    rArr[i] = Integer.MAX_VALUE;
    // 开始排序
    i = 0;
    int j = 0;
    // 遍历当前排序区间
    for (int k = p; k < r + 1; k++) {
        // 左侧拿牌
        if (lArr[i] <= rArr[j]) {
            arr[k] = lArr[i];
            i++;
        } else { // 右侧拿牌
            arr[k] = rArr[j];
            j++;
        }
    }
    // 打印每一次merge的结果
    System.out.println(Arrays.toString(arr));
}

相关文章

  • 计数排序、基数排序和桶排序

    阅读经典——《算法导论》07 到目前为止,我们已经介绍了插入排序、归并排序、堆排序、快速排序这四种排序算法,他们的...

  • 堆排序

    阅读经典——《算法导论》05 本文介绍一种神奇的排序方法:堆排序。 堆排序不像插入排序和归并排序那样直观,它利用了...

  • 2018-06-30

    排序算法之归并排序 归并排序算法是排序算法中的经典算法之一,其核心思想是利用归并的思想实现的排序方法,该算法采用经...

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • 排序算法之归并排序

    归并排序(Merge Sort) 归并排序是利用归并的思想实现排序的方式,该算法采用的是经典的分治算法 归并排序过...

  • 算法导论-归并排序

    1.伪代码 MERGE算法图示 2.Python代码 result: 循环不变性对于归并算法 初始化: 在循环之前...

  • [算法导论]归并排序

    时间复杂度 《算法导论》2.3.1 分治法。 归并排序采用了分治法的递归排序。分治法:分解子问题,解决子问题,合并...

  • 归并排序【算法导论】

    注:学习算法导论,按照标准伪代码理解翻译为java实现,如有兴趣理解整个过程的细节,建议阅读《算法导论》第二章:2...

  • 归并排序

    图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用...

  • 归并排序

    归并排序 这个排序算法是建立在归并操作上的一种有效的排序算法,算法主要采用分治法,归并排序的算法复杂度为O(n*l...

网友评论

      本文标题:归并排序【算法导论】

      本文链接:https://www.haomeiwen.com/subject/ncnkictx.html