题目:
两个按 非递减顺序 排列的整数数组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;
}
实验结果: