排序算法之合并排序

文章介绍了合并排序算法,这是一种基于分治策略的排序方法。它通过不断将序列拆分为小部分,然后递归地合并这些部分来实现排序。文中提供了Java代码示例,展示如何将两个已排序的数组合并成一个,并展示了合并排序的完整过程。
摘要由CSDN通过智能技术生成

合并排序

合并排序采用分治法不停地将待排序序列分成很小的组,通过递归的合并这些组从而实现排序。

算法步骤

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

代码实现
public static int[] mergeSort(int[] nums) {
    if (nums.length < 2) {
        return nums;
    }
    int midIndex = nums.length / 2;
    int[] leftArr = new int[midIndex];
    int[] rightArr = new int[nums.length - midIndex];
    for (int i = 0;i < nums.length;i++) {
        if (i < midIndex) {
            leftArr[i] = nums[i];
        } else {
            rightArr[i - midIndex] = nums[i];
        }
    }
    return merge(mergeSort(leftArr), mergeSort(rightArr));
}

public static int[] merge(int[] nums1, int[] nums2) {
    int[] resArr = new int[nums1.length + nums2.length];
    int m = 0;
    int n = 0;
    int o = 0;
    for (int i = 0;i < nums1.length + nums2.length;i++) {
        if (nums1[m] < nums2[n]) {
            resArr[o++] = nums1[m++];
        } else {
            resArr[o++] = nums2[n++];
        }
        if (m == nums1.length || n == nums2.length) {
            break;
        }
    }
    if (m < nums1.length) {
        for (int i = o;i < resArr.length;i++) {
            resArr[i] = nums1[i - nums2.length];
        }
    }
    if (n < nums2.length) {
        for (int i = o;i < resArr.length;i++) {
            resArr[i] = nums2[i - nums1.length];
        }
    }
    return resArr;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值