题目
编写函数void fun(int a[],int m,int b[],int n,int c[])将已按升序排好的数组a(共有m个数)和已按降序排好数组b(共有n个数)合并在数组c中,并使c按降序排列,然后用主函数调用。(注:不允许合并后再排序)
函数接口定义:
void fun(int a[], int m, int b[], int n, int c[]);
输入包括四行:第一行输入数组a的元素个数 第二行包括m个元素(保证升序)第三行输入数组b的元素n 第四行包括n个元素(保证降序)
裁判测试程序样例:
#include<stdio.h>
void fun(int a[], int m, int b[], int n, int c[]);
int main()
{
int m,i,n;
int a1[10];
int b1[10];
int c1[20];
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d",&a1[i]);
}
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&b1[i]);
}
fun(a1, m, b1,n, c1);
for(i=0;i<m+n;i++)
{
printf("%d ",c1[i]);
}
printf("\n");
return 0;
}
/* 请在这里填写答案 */
输入样例:
3
1 2 3
5
5 4 3 2 1
输出样例:
5 4 3 3 2 2 1 1
参考解答:
解法一:
挨个比较,依次导入c数组中
void fun(int a[], int m, int b[], int n, int c[])
int i,j,k;
for(i=m-1,j=0,k=0;i>=0&&j<n;k++)
{
if(a[i]>b[j])
c[k]=a[i--];
else c[k]=b[j++];
}
if(i==1)
for(;j<n;j++,k++)
c[k]=b[j];
else
for(;i>=0;i--,k++)
c[k]=a[i];
}
解法二:
先插入一组数组,再用插入排序法插入另一组数组
void fun(int a[], int m, int b[], int n, int c[])
{
int i,j,k;
for(i=0;i<n;i++)
c[i]=b[i];
for(i=m-1;i>=0;i--)
{
for(j=0,k=n+m-i-2;j<n+m-i;j++)
{
if(a[i]>=c[j])
{
k=j;
break;
}
}
for(j=n+m-i-1;j>k;j--)
c[j]=c[j-1];
c[k]=a[i];
}
}