有序序列合并

有序序列合并

https://ac.nowcoder.com/acm/contest/827/J

又是一道来自编程语言初学练习赛之第七场的最后一题!
有序序列合并!
康康它的题目!

题目描述

输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。

输入描述:

输入包含三行,
第一行包含两个正整数n, m(1 ≤ n,m ≤ 100),用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数(范围1~5000),用空格分隔。
第三行包含m个整数(范围1~5000),用空格分隔。

输出描述:

输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。
把两个序列合并为一个序列......
好像还挺简单的.....
设一个数组,大小设为两个序列长度之和......
也就是所输入的n和m之和......
#include"stdio.h"
#define N 201
int main()
{
    int i,j,n,m,t;
    int a[N];
    scanf("%d %d",&n,&m);
    for(i=0;i<n+m;i++)
        scanf("%d ",&a[i]);
直接将两个序列按顺序赋值给同一个数组......
好像没什么问题.....我们往下看....
    for(i=0;i<=n+m-1;i++)
    {
        for(j=0;j<n+m-i;j++)
        {
            if(a[j]>a[j+1])
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
标准的冒泡排序.........
    for(i=0;i<n+m;i++)
    {
        printf("%d ",a[i]);
    }
}
输出这个序列.......自测过了!!!!!
然而现实总是残酷的......哪出了BUG呢..........
----------------------------------------------------------------------------------------------------------------------------------------------------
找到了一段某不知名dalao的AC代码......
#include <iostream>
using namespace std;
int main() 
{
    int n;
    int m;
    cin >> n >> m;
    int a[n];
    int b[m];
    for (int i = 0; i < n; ++i) 
        {
        cin >> a[i];
    }
    for (int i = 0; i < m; ++i)
       {
        cin >> b[i];
    }
    int len = n + m;
    int index = 0;
    int ai = 0;
    int bi = 0;
    while (index < len) 
        {
        if (ai == n) 
                {
            cout << b[bi] << " ";
            bi++;
        } 
                else if (bi == m) 
                {
            cout << a[ai] << " ";
            ai++;
        } 
                else if (a[ai] > b[bi]) 
                {
            cout << b[bi] << " ";
            bi++;
        } 
                else 
                {
            cout << a[ai] << " ";
            ai++;
        }
        index++;
    }
    cout << endl;
    return 0;
}
看来dalao和我们的思路完全不一样.....
dalao定义了两个数组,并依次为两个数组赋值......
看了一眼后面的循环条件结构.......这TM是啥!(本菜鸡已自闭)

以下是本菜鸡的理解......

我扫了一眼这四个条件结构......

先看最后两个条件结构......

dalao先对两个数组角标相同的元素作比较,并输出较小的那一个,然后将被输出的元素的角标加一.....

在下一次循环中,将会是上一次被输出的数组中的下一个元素与原本较大的那个数作比较,再输出两者中较小的那一个.....

以此类推的话......将会以升序排列输出两个数组合并的结果.....(dalao的思路果然是我等菜鸡所想不到的)

那么......前两个条件结构干什么的呢....

看看条件.....当ai==n(bi==m)时,输出b(a)数组的下一个元素,反推回去....

ai==n(bi==m)时只有一种可能.....那就是.....

a[n-1](b[m-1])被输出了,此时a(b)数组中的元素都被输出了,没有元素能与另一个数组继续比较.......

此时只需要按顺序输出b(a)数组中剩下的数.....

膜拜dalao......
----------------------------------------------------------------------------------------------------------------------------------------------------
看懂了dalao的代码,那我的代码到底哪出了问题呢.......

比较了下最后的输出......我试着在最后加了句换行输出,然后我吐了出来......

过了...................(卒)

全部评论
一塌糊涂
点赞 回复 分享
发布于 2021-09-11 14:24
//冒泡i j循环范围要<size-1
点赞 回复 分享
发布于 2020-04-21 14:19
冒泡循环条件 for(i=0;i
点赞 回复 分享
发布于 2020-05-18 12:20
for(i=0;i<=n+m-1;i++) { for(j=0;j
点赞 回复 分享
发布于 2021-07-06 10:09
会得一塌糊涂
点赞 回复 分享
发布于 08-13 22:02 河北

相关推荐

10-12 19:08
666 C++
花开蝶自来_:技能:听动物叫,让雪豹闭嘴
点赞 评论 收藏
分享
吃不饱的肱二头肌很想退休:tnnd 我以为选妹子呢,亏我兴高采烈的冲进来😠
投递快手等公司10个岗位
点赞 评论 收藏
分享
10 收藏 评论
分享
牛客网
牛客企业服务