合并两个有序数组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;
}


运行结果如下:

在这里插入图片描述在这里插入图片描述

posted @   笑着的程序员  阅读(75)  评论(0编辑  收藏  举报  
编辑推荐:
· 如何编写易于单元测试的代码
· 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】
点击右上角即可分享
微信分享提示