XJOI 1206 数组-合并有序数组 题解

时间:1s 空间:256M

题目描述:

给你两个有序的数组。合并这两个数组成为一个新的有序数组,并输出。

输入格式:

第一行输入两个整数n,m
第二行输入n个数,表示第一个有序数组
第三行输入m个数,表示第二个有序数组

输出格式:

输出n+m个数,表示两个数组合并之后的结果。

样例输入:

3 4
4 5 8
1 3 6 7

样例输出:

1 3 4 5 6 7 8

约定:

1<=n<=5000000,1<=m<=5000000,所有的数都在有符号32位整数范围内

提示:

注意数据范围

解析:

可以用类似于归并排序的思想,两数组的“头”依次进行比较,小的进入新数组并在原数组中忽略,大的进行下一轮的比较。这样不断循环,就能实现。具体代码如下:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
#define N 5000000
using namespace std ;
int a [ N + 1 ] , b [ N + 1 ] , n , m , ans [ 2 * N + 1 ] ;
int main ( )
{
    scanf ( "%d %d" , & n , & m ) ;
    for ( int i = 1 ; i <= n ; i ++ ) scanf ( "%d" , & a [ i ] ) ;
    for ( int i = 1 ; i <= m ; i ++ ) scanf ( "%d" , & b [ i ] ) ;   //输入两个数组
    int i = 0 , j = 0 , k = 0 ;
    while ( i + j < n + m )
    {
        k ++ ;
        if ( i + 1 > n )          //检查a数组是否全被放入ans数组中,如果为空,只能用b数组
        {
            ans [ k ] = b [ j + 1 ] ;
            j ++ ;
        }
        else if ( j + 1 > m )            //和上面一个if同样的道理
            {
                ans [ k ] = a [ i + 1 ] ;
                i ++ ;
            }
            else if ( a [ i + 1 ] > b [ j + 1 ] )   //这是一般情况的比较
            {
                ans [ k ] = b [ j + 1 ] ;
                j ++ ; 
            } else
            {
                ans [ k ] = a [ i + 1 ] ;
                i ++ ;
            }
    }
    for ( int i = 1 ; i <= n + m ; i ++ ) printf ( "%d " , ans [ i ] ) ;  //输出结果
    return 0 ;
}

猜你喜欢

转载自blog.csdn.net/ZJ_MRZ/article/details/80952140