弟弟4•有序序列合并

题目【牛客】

在这里插入图片描述

解法一【一个数组+冒泡排序】

 #include <stdio.h>

int main() {
    int a,b,tem;
    while (scanf("%d %d", &a,&b) != EOF) {  
        int arr[a+b];
        for(int i=0;i<a;i++)
        {
            scanf("%d",&arr[i]);
        } 
        for(int i=a;i<(a+b);i++)
        {
            scanf("%d",&arr[i]);
        }
        for(int i=0;i<a+b-1;i++)
        {
            for(int j=0;j<(a+b-1-i);j++)
            if(arr[j]>arr[j+1])
               {
               tem=arr[j];
               arr[j]=arr[j+1];
               arr[j+1]=tem;
               }
        }
        for(int i=0;i<(a+b);i++)
        {
            printf("%d ",arr[i]);
        }
    }
    return 0;
}

在这里插入图片描述

思路讲解

这个方法的思路还是比较简单的,主要是要满足“三行输入”的要求,所以,虽然是存在一个数组里的数据,但要分两次输入。

第一次先输入a个数据,第二次的时候就从数组中下标为a的数据开始输入,因为数组的第一个下标是0。

数据输入完毕以后,就都在一个数组里了,使用冒泡排序,排好序再输出就可以了。
冒泡排序的使用可以参考: https://blog.csdn.net/weixin_50915462/article/details/113485345

解法二【三个数组】

 #include <stdio.h>

int main()
{
    int a, b;
    while (scanf("%d %d", &a, &b) != EOF)
    {
        int arr[a], brr[b], crr[a + b];
        for (int i = 0; i < a; i++)
        {
            scanf("%d", &arr[i]);
        }
        for (int i = 0; i < b; i++)
        {
            scanf("%d", &brr[i]);
        }
        int ia = 0;
        int ib = 0;
        for (int i = 0; i < (a + b); i++)
        {

            if ((arr[ia] < brr[ib] && ia != a) || ib == b)
            {
                crr[i] = arr[ia];
                ia++;
            }
            else
            {
                crr[i] = brr[ib];
                ib++;
            }
        }
        for (int i = 0; i < (a + b); i++)
        {
            printf("%d ", crr[i]);
        }
    }
    return 0;
}

在这里插入图片描述

思路讲解

主要原理

上下比较,因为从小到大排列,所以上面小取上面,下面小取下面。因为两个都是升序,所以如果上下的个数没法对应,多的直接放后面。在这里插入图片描述
以上示例中,先比较第一组,1比2大,从小到大排列,所以1排在前面,arr[0]=1,2排在紧跟着arr[0]的arr[1]=2。

然后再依次比较剩下的组,同理排列。如果上下的个数不对应,无法成组,因为是升序,所以多出来的直接跟在后面就可以了,比如:在这里插入图片描述

代码思路讲解:

先分别输入两个数组的数据。

定义ia和ib分别控制数组arr和brr的下标,并初始化为0,因为数组的第一个下标是0,要习惯初始化,避免计算机给随机值。

用for循环遍历数组进行排序,同时把排好序的数据赋值给数组crr。if 的条件都是“数组brr中数字的个数更少”的情况。else就是剩下的情况了,即“数组arr中数字的个数更少”的情况。

for循环中的 i 控制数组crr的遍历,无论进入了 if 还是 else ,i 都会++。

arr和brr的每个数据都会被录入crr,所以进入了 if ,就只ia++,而ib不变,不会跳过任何一个数据。

解释一下(arr[ia] < brr[ib] && ia != a) 思路:当arr的值更小时,arr排在crr的前面,与此时arr下标相同的brr紧随其后。此时的arr没被录入完,即(数组brr中数字的个数更少)的情况,因为录入完就不用排序了,多出来的直接跟在后面。谁少谁就先被录入完

解释一下(ib == b)的思路此时brr已经录入完了,即(数组brr中数字的个数更少)的情况,则多出来的arr不用排序,可以直接录入了。

else的情况同理,只不过把上面解释里的arr和brr的名字互换一下。

经验
当看到if…else却一脸懵逼时,集中火力去搞懂 if 的条件包含哪些情况。

注意不要太纠结于else所包含的情况,因为 if 的可以通过它小括号内的条件和花括号内的操作这两方面信息来理解出 if 包含的情况。

知道了 if 后,一般else也容易知道了。
❤️❤️❤️恭喜! 恭喜! 又收了一名小弟! ❤️❤️❤️

  • 28
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值