合并有序数组(含有变长数组)

大家好今天的每日一题又来啦!

文章目录


题目展示

输⼊两个升序排列的序列,将两个序列合并为⼀个有序序列并输出。 输⼊包含三⾏,第⼀⾏包含两个正整数n, m,⽤空格分隔。n表⽰第⼆⾏第⼀个升序序列中数字的个 数,m表⽰第三⾏第⼆个升序序列中数字的个数。其中 1<=n<=30, 1<=m<=30 第⼆⾏包含 n 个整数,⽤空格分隔。 第三⾏包含 m 个整数,⽤空格分隔。 输出为⼀⾏,输出⻓度为n+m的升序序列,即⻓度为n的升序序列和⻓度为m的升序序列中的元素重 新进⾏升序序列排列合并。


提示:以下是本篇文章正文内容,下面案例可供参考

一、题目解析

定义⼀个⻓度为 n+m 的新数组 arr3 ,将两个有序数组合并到 arr3 数组中,使得 arr3 数组有 序。

1. 定义⼀个⻓度为 n+m 的新数组 arr3 ,以及两个指针 i 和 j ,分别指向 arr1 和 arr2 的开头;

2. 定义⼀个计数器 k ,初始化为 0;

3. ⽐较 arr1[i] 和 arr2[j] ,将较⼩的数存⼊ arr3 中,并将对应指针向后移动⼀位;

4. 将计数器 k 加 1;

5. 重复步骤 3 和 4 直到某个指针越界;

6. 将另⼀个指针指向的数组的剩余所有元素依次存⼊ arr3 中,存⼊同时将计数器 k 的值⾃增 1;

7. ⾄此, arr3 数组中的元素为 arr1 数组和 arr2 数组合并并排序后的结果,按序输出前 k 个元素即可。

二、代码及结果展示

1.代码展示

代码如下(示例):

#include <stdio.h>

int main()
{	
	int i=0;
	int n=0;
	int m=0;
	int arr1[30]={0};
	int arr2[30]={0};
	int arr3[60]={0};
	scanf("%d %d",&n,&m);
	for (i=0;i<n;i++)
	{
		scanf("%d",&arr1[i]);
	}
	for(i=0;i<m;i++)
	{
		scanf("%d",&arr2[i]);
	}
	i=0;
	int j=0;
	int k=0;
	while(i<n&&j<m)
	{
		if(arr1[i]<arr2[j])
		{
				arr3[k]=arr1[i];
				k++;
				i++;
		}
		else
		{
			arr3[k]=arr2[j];
			k++;
			j++;
		}
		if(i==n)
		{
			for(;j<m;j++)
			{
				arr3[k]=arr2[j];
				k++;
			}
			
		}
		if(j==m)
		{
			for(;i<n;i++)
			{
				arr3[k]=arr1[i];
				k++;
			}
			
		}
	}
	for(k=0;k<n+m;k++)
	{
		printf("%d",arr3[k]);
	}
	return 0;
} 

2.结果展示


总结

今天的每日一题结束啦谢谢大家O(∩_∩)O。不对的地方请在评论区留言谢谢大家的斧正

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值