合并两个有序数组(C++版)

题目:

两个从小到大排序以后的数组A和B,其中A的末端有足够的缓冲空容纳B。

请编写一个方法,将B合并入A并排序。

给定两个有序int数组AB,A中的缓冲空用0填充,同时给定A和B的真实大小int n和int m,请返回合并后的数组。


思路:从后向前逐个比较填充A数组。


贴代码:

int cmpMax(int a, int b)
	{
		return (a > b) ? a : b;
	}

	// n为数组A的真实长度
	// m为数组B的真实长度
	int* mergeAB(int* A, int* B, int n, int m) 
	{
		int max = cmpMax(A[n - 1], B[m - 1]);
		int mxlen = cmpMax(n, m);

		int Adx = n - 1;
		int Bdx = m - 1;
		int cnt = n + m - 1;

		while (cnt >= 0)
		{
			// 从后往前填充

			if (Adx >= 0 && Bdx >= 0)
			{
				A[cnt] = cmpMax(A[Adx], B[Bdx]);
				if (A[cnt] == A[Adx])
				{
					Adx--;
				}
				else if (A[cnt] == B[Bdx])
				{
					Bdx--;
				}
			}
			else if(Adx < 0)
			{
				A[cnt] = B[Bdx--];
			}
			else if(Bdx < 0)
			{
				A[cnt] = A[Adx--];
			}
			cnt--;
		}

		return A;
	}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值