问题描述
小伦同学在新生军训期间因为高中时期突出的编程能力被ACM基地发掘到了,在组织的帮助下他可以实现免军训进而参加基地进行的亚洲区域赛。因此他向教官打了个报告后,准备开溜,这时教官要求他编程实现以下任务才能离开连队:现有两个数组 A 和 B,数组 A 是升序排序的有序数组,数组 B 是降序排序的有序数组,要求把这两个数组合并为一个升序排序的有序数组。面对这样的任务,想必你也能轻而易举解决吧!
输入
第一行输入 N(1 <= N <= 100) 和 M(1 <= M <= 100),分别代表数组 A 和 B 的长度。
第二行输入 N 个数,代表数组 A 。
第三行输入 M 个数,代表数组 B 。
输出
输出一行合并后的数组。
输入范例
3 4 2 3 5 6 4 2 1
输出范例
1 2 2 3 4 5 6
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>
#define N 200
#define M 100
void solve(int *p,int num,int n,int i)//插入数字函数
{
for (int k = n; k > i; k--)
{
p[k] = p[k-1];
}
p[i] = num;
}
int main( )
{
int n, m, l = 0;
int arr_1[N] = {0};
int arr_2[M] = {0};
scanf("%d%d",&n,&m);
//输入数据
for(int i = 0; i < n; i++)
scanf("%d",&arr_1[i]);
for(int j = 0; j < m; j++)
scanf("%d",&arr_2[j]);
for(int j = m-1; j >=0 ; j--)
{
for(int i = l; i < n; i++)
{
if (arr_2[j] <= arr_1[i])
{
l = i;
solve(arr_1,arr_2[j],n,i);//调用函数,把数组2的数据插入到数组1中
n++;//数组1中每加入一个数字,n+1
break;//避免重复插入
}
if( i == n-1)
{
arr_1[n] = arr_2[j];//在数组1尾部加入数组2的大于数组1最大的数的数
n++;
break;
}
}
}
for(int i = 0; i < n; i++)
printf ("%d ",arr_1[i]);
return 0;
}