NC22 合并两个有序的数组 - java语言实现

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。


1. 题目描述

给出一个有序的整数数组 A 和有序的整数数组 B ,请将数组 B 合并到数组 A 中,变成一个有序的升序数组

题目要求:
1.保证 A 数组有足够的空间存放 B 数组的元素, A 和 B 中初始的元素数目分别为 m 和 n,A的数组空间大小为 m+n
2.不要返回合并的数组,将数组 B 的数据合并到 A 里面就好了,且后台会自动将合并后的数组 A 的内容打印出来,所以也不需要自己打印
3. A 数组在[0,m-1]的范围也是有序的
示例
输入:
[1,2,3],[2,5,6]
返回值:
[1,2,2,3,5,6]

2. 题目解读

数组A有m个元素,数组B中有个元素,数组A中有足够的空间(m+n)存放两个数组合并后的元素,但是合并后的数组A是有序的。
【注】不要使用sort函数,自己实现方法合并数组。

3. 思路

方式一:直接把B数组存放到A数组后面,再利用Sort函数进行排序即可;但这样只是取巧的方式,我们需要一些简单的思想算法来进行解题。- (不推荐,如果实在做不出来,可以临时使用)
方式二:定义三个变量,来记录数组下标;因为数组都是有序的,需要从数组末尾下标进行操作,把较大的数排在后面;定义数组A下标pa = m-1,数组B下标pb = n-1,定义k下标来存放pa与pb下标比较后较大的值 k = m+n-1;

两数组中元素比较涉及循环,循环结束有两种结果:数组A结束 或 数组B结束
– ① 数组B结束,对结果没有影响,数组A是有序的;(只有数组B中的数大于数组A中的数,才可能放入A中,所以只要是数组B结束的A中一定是有序的)
– ②数组A结束,说明数组B中还有元素,因为数组是有序的,所以需要把数组B中剩余的元素根据下标依次插入到数组A中即可;

图示起始位置:

在这里插入图片描述

循环条件控制示例图:

在这里插入图片描述

4. 代码实现

代码实现具体操作:
① 想到用三种下标实现pa,pb,k
② 找到循环条件pa >= 0 && pb >= 0
③ 比较pa与pb下标在数组中对应的元素,大的元素放在数组A中的k位置;(比较完记得下标移动,谁数大,谁下标-1)
④ 单独处理数组A先走完,数组B中还有剩余的情况

public void merge(int A[], int m, int B[], int n) {
        int pa = m - 1;
        int pb = n - 1;
        int k = m + n - 1;
        while (pa >= 0 && pb >= 0) {
            if(A[pa] < B[pb]) {//数组B中的元素大,就讲B的元素放到数组A中的k位置
                A[k] = B[pb];
                pb--;//数组B下标-1
                k--;//k位置-1
            } else {
                A[k] = A[pa];
                pa--;//数组A下标-1
                k--;//k位置-1
            }
        }
        //处理数组A先走完,数组B中还有剩余的情况
        while(pb >= 0) {
            A[k] = B[pb];
            pb--;
            k--;
        }
    }

总结

✨✨✨各位读友,本篇分享到内容如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值