编写程序,分别输入两个按从小到大排序的数组 a 和 b,将这两个有序数组合并,使合并后的数组仍是从小到大有序的。
合并两个有序数组的方法:
-
有两个有序数组a
和b
,其中数组a
的末尾有足够的空间容纳数组b
,将数组b
容纳到数组a
中。
-
创建一个新数组c
,数组c
的长度要大于等于数组a
和b
之和。通过比较两个有序数组中的元素,谁小就把谁放到数组c
中,直到其中一个数组为空,最后把剩下的数组元素全部放到数组c
里。
测试输入:
10
10
15
42
52
59
64
67
73
82
88
3
24
32
57
输入说明: 第一行为n
,表示输入数组a
的n
个整数。 第二行为从小到大的n
个整数。 第三行为m
,表示输入数组b
的m
个整数。 第四行为从小到大的m
个整数。
预期输出: 10 15
24
32
42
52
57
59
64
67
73
82
88
用第二种方法做:
#include<stdio.h>
#define N 20
int main()
{
int a[N]={ 0 }, b[N]={ 0 };
int i,j,k,anum,bnum,c[N+N];
scanf("%d",&anum); //输入数组a元素个数
for(i=0;i<anum;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&bnum); //输入数组b元素个数
for(i=0;i<bnum;i++)
{
scanf("%d",&b[i]);
}
/***** 在数组a和b都有数据时比较两个数组 *****/
/********** Begin *********/
i=0,j=0,k=0;
while(i<anum&&j<bnum)
{
if(a[i]>=b[j])
{
c[k]=b[j];k++;j++;
}
else
{
c[k]=a[i];k++;i++;
}
}
/********** End **********/
/***** 如果数组a还有数据 *****/
/********** Begin *********/
for(i;i<anum;i++)
{
c[k]=a[i];k++;
}
/********** End **********/
/***** 如果数组b还有数据 *****/
/********** Begin *********/
for(j;j<bnum;j++)
{
c[k++]=b[j];
}
/********** End **********/
/***** 输出数组c *****/
/********** Begin *********/
for(i=0;i<anum+bnum;i++)
{
printf ("%d ",c[i]);
}
/********** End **********/
return 0;
}
运行结果: