合并两个有序数组C++
合并两个有序数组
题目描述:
有两个排序的数组A1和A2,内存在A1的末尾有足够的空余空间容纳A2。请实现一个函数,把A2中的所有数字插入到A1中,并且所有的数字是排序的。
思路分析:从尾到头边比较,边移入正确的位置,时间复杂度为O(n)
#include <iostream>
using namespace std;
void Combin2Array(int str1[], int length1, int str2[], int length2)
{
if (str1 == nullptr|| length1 <= 0 || str2 == nullptr || length2 <= 0)
return;
int len1 = 0;
for (int i = 0; i < length1; ++i) //使用for循环计算数组中实际的元素数目
{
if (str1[i])
len1++;
}
int newLength = len1+length2 - 1;//这是最新修改的地方!!!新数组的长度是两个数组非零元素数量之和
int len2 = length2 - 1;
len1--; //数组最后一个数字的序号为长度减一
while (len1 >= 0 && len2 >= 0)
{
if (str1[len1] < str2[len2])
{
str1[newLength--] = str2[len2--];
}
else
{
str1[newLength--] = str1[len1--];
}
}
//下面这部分是新增的,不可缺少,处理一个数组中的元素已经完全加入到新数组,另一个还没完的情况
while (len1 < 0 && len2 >= 0)
{
str1[newLength--] = str2[len2--];
}
while (len2 < 0 && len1 >= 0)
{
str1[newLength--] = str1[len1--];
}
}
int main()
{
int array1[100] = { 1, 3, 5, 7, 9 };
int array2[] = { 2, 4, 6, 8, 10 , 11, 12, 13, 14, 15};
//int array1[100] = {13, 15, 16, 17, 19 };
//int array2[] = { 2, 4, 6, 8, 10 , 11, 12, 13, 14, 15};
Combin2Array(array1, sizeof(array1) / sizeof(int), array2, sizeof(array2) / sizeof(int));
for (int i = 0; i < sizeof(array1) / sizeof(int); ++i)
{
if (array1[i])//增加判断条件,只输出非零元素!!!
{
cout << array1[i] << '\t';
}
}
/*基于范围的for循环
for (auto x :array1)
{
cout << x << '\t';
}
*/
return 0;
}
运行结果如下:
【华为OD机试真题】可以转到CSDN相关专栏订阅学习:https://blog.csdn.net/weixin_45541762/article/details/129903356
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】