深刻理解归并排序

「归并排序」核心就是每个数组「两两比较」并合并,直至只剩下一个数组。

我们通过图片的方式,来排序一个数组为例:

这里有六个数字,我们第一步先将一个数组视为一组,并对相邻的两组进行「两两比较」。可以得到如下:

再进行两两比较,如下:

最后进行一次两两比较结束,如下:

附上 Java 代码:

public class MyMegerSort {
    // 归并排序
    public int[] sortArray(int[] nums) {
        int length = nums.length;
        // src 代表将要排序的数组,dst 表示将排序结果暂存的数组
        int[] src = nums;
        int[] dst = new int[length];

        // base 代表一个单位的数组的大小,并且每次增大一倍
        // * 「归并排序」核心就是每个数组「两两比较」并合并,直至只剩下一个数组
        // base 的大小是已排序好的数组大小
        for (int base = 1; base < length; base += base) {
            for (int start = 0; start < length; start += base * 2) {
                int mid = Math.min(start + base, length);
                int end = Math.min(start + base * 2, length);

                // index1、index2 分别代表着将要对比的两个数组的头节点。分别为左数组头节点和右数组头节点
                // k 用于表示 dst 的下标,含义为排序到的下标位置
                int index1 = start, index2 = mid, k = start;
                // 归并排序核心代码。遍历这两个排好序的数组,每次将一个最小的节点插入 dst 数组
                while (index1 < mid || index2 < end) {
                    if (index2 == end || (index1 < mid && src[index1] < src[index2])) {
                        dst[k++] = src[index1++];
                    } else {
                        dst[k++] = src[index2++];
                    }
                }
            }

            // 交换两个数组 或 为 dst 数组开辟新的数组空间
            int[] temp = src;
            src = dst;
            dst = temp;
        }

        return src;
    }
}

最后附上图片来源:「数据结构——三分钟搞定归并排序」

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值