【Java】两个排序后的数组A和B,其中A的末端有足够的缓冲容纳B。编写一个方法,将B合并入A并排序。

给定两个排序后的数组A和B,其中A的末端有足够的缓冲容纳B。编写一个方法,将B合并入A并排序。

看起来很像归并排序的最后一步,但还有些不同,由于A的末端足够容纳B,我们不需要再新建一个缓冲数组。

那么直接将A和B顺序比较插入相应位置即可,但如果从小到大比较,A的数据会被覆盖,由于A的末端是空的,我们可以从A和B最大的元素开始比较,从后往前依次插入.

要注意的是如果B的元素比A多,那么要逐一比较好几轮,才能把B的所有元素都插入A的正确位置。

反之如果A的元素比B多,则不需要这么做,因为A的元素已经在那里了,且最后一定是排好序的。


public class merge {
	public static void mergeArrays(int[] a, int[] b, int lastA, int lastB) {
		int round = (int)Math.ceil((double)lastB / lastA); //进一法取A和B要比较的轮数
		int indexA = lastA - 1;
		int indexB = lastB - 1;
		int indexMerged = lastB + lastA - 1;
		while (round >= 1) {			
			while(indexA >= 0 && indexB >= 0) {
				if (a[indexA] >= b[indexB]) {
					a[indexMerged--] = a[indexA--];
				}
				else {
					a[indexMerged--] = b[indexB--];
				}
			}
			round--;
			indexA = lastA - 1;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值