合并两个有序数组

题目:

        两个按 非递减顺序 排列的整数数组arr和brr,另有两个整数a,b分别表示两个数组中有效元素数目,现将两个数组按 非递减顺序合并到arr数组中。

        注意:不创建新的数组,直接将结果存放在arr中,所以arr的初始长度是a+b

分析:

        对两个数组中元素可能数目进行讨论

1. b == 0 && a >0   (直接输出arr数组即可,后续不在考虑)
2. a == 0 && b >0
3. a > 0 && b > 0

针对可能2:
直接将brr中元素全部按顺序存放到arr中即可

针对可能3:
我们从后向前开始比较(有效元素)
分为两种情况 ① arr中待放元素<brr中待放元素     ->将brr待放元素放在合适位置
                       ② arr中待放元素>=brr中待放元素  ->将arr待放元素放在合适位置
如图:就是实现的简单原理

实现代码:

void merge(int* arr, int a, int* brr, int b)//a,b分别表示数组中有效元素个数
{
	while (a > 0 && b > 0)
	{
		if (arr[a - 1] < brr[b - 1])
		{
			arr[a + b - 1] = brr[b - 1];
			--b;
		}
		else
		{
			arr[a + b - 1] = arr[a - 1];
			--a;
		}
	}
	if (a == 0 && b > 0)
	{
		for (int i = 0; i < b; ++i)
		{
			arr[i] = brr[i];
		}
	}
}


int main()
{
	int arr[] = { 1,3,5,7,0,0,0,0 };
	int brr[] = { 2,4,6,8 };
	merge(arr, 4, brr, 4);
	int n = sizeof(arr) / sizeof(arr[0]);//计算数组长度
	for (int i = 0; i < n; i++)
	{
		printf("%d  ", arr[i]);
	}
	return 0;
}

实验结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值