c 语言 两个有序数组合并

/*****
题目描述
已知数组a中有m个按升序序排列的元素,数组b中有n个降序排列的元素,编程将a与b中的所有元素按降序存入数组c中。

输入
输入有两行,第一行首先是一个正整数m,然后是m个整数;第二行首先是一个正整数n,然后是n个整数,m, n均小于等于1000000。

输出
输出合并后的m+n个整数,数据之间用空格隔开。输出占一行。

样例输入 Copy
4 1 2 5 7
3 6 4 2
样例输出 Copy
7 6 5 4 2 2 1
提示
试图排序的孩子们要小心了~~~~~~
*****/
!!!!!注意一,不能在函数内定义数组大小,会导致栈溢出。第二,不能采用冒泡或者选择的排序方式,因为双重循环会导致超时。

#include 
#include 
#define N 2000000
//自己写的代码 判断时间过长
//这里不能使用for循环的嵌套。费时间。
int c[N];//这里使用堆定义,防止栈堆溢出。
int a[N/2],b[N/2];
int main()
{
    int m,n,i;
    scanf("%d",&m);
    for(i = m-1; i>= 0; i--)
    {
        scanf("%d",&a[i]);
    }//完成a数组的升序到降序的转变
    scanf("%d",&n);
    for( i = 0; i<n; i++)
    {
        scanf("%d",&b[i]);
    }//完成b数组的降序输入

    //接下来就是对三个数组的操作,首先明白一点,都是降序排列
    int j,k;
    i = 0;j = 0;k = 0;
    while ( i < m && j < n)
    {
        if( a[i]>= b[j])//本题没有要求去重,所以可以等于
        c[k++] = a[i++];
        //这里是先赋值再自加,将a,b中较大的数字赋值出去
        //如果 a中的数字大,就将a的值赋给c
        else
        c[k++] = b[j++];//如果 b中的数字大,就将b的值赋给c
    }
    while (i < m)//这两个while 是为了防止当a或者b中的有的数字
    //没有赋值完毕之所以两个能连住是因为必有一个不执行。
    c[k++] = a[i++];
    while (j < n)
    c[k++] = b[j++];
    for ( i = 0;i<m+n;i++)
    {
        printf("%d ",c[i]);
    }
    return 0;
}

你可能感兴趣的:(c 语言 两个有序数组合并)