C语言每日一题(8):有序序列合并

标头风景


  • 文章主题:有序序列合并🔥🔥🔥
  • 所属专栏:C语言每日一题📗
  • 作者简介:每天不定时更新C语言的小白一枚,记录分享自己每天的所思所想😄🎶
  • 个人主页:[₽]的个人主页🏄🌊


前言

编程起因

最近在牛客网中学到了一个比较有意思的题目,觉得对于锻炼编程思维比较有意义,便在VS上用优化的方法写了一遍后写下了这篇博客分享给大家。

项目介绍

项目名

有序序列合并

项目描述

输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
数据范围:1 ≤ n, m ≤ 1000,序列中的值满足 0 ≤ val ≤ 30000

输入描述

输入包含三行,

第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。

第二行包含n个整数,用空格分隔。

第三行包含m个整数,用空格分隔。


设计思路

1.整体逻辑

方法一:将两行数字合并成一行数字后输入到一个数列中,再用冒泡排序法将其输出。方法二:将两行数字分别输入进两个数列中,两个数列边遍历边比较取最小元素输出,某一个数列首先输出完之后退出循环。用分支语句判断输出完的数列是哪个后,将另一个数组剩下的元素输出。

2. 具体逻辑

方法一:

利用输入进去的行元素个数n和m遍历,将两行数字合并成一行数字后输入到一个数列中,再用冒泡排序法将其输出。

方法二:

利用输入进去的行元素个数n和m遍历,将两行数字分别输入进两个数列中,再用元素i和j储存两数列的下标,再分别各取第一个元素比较最小的元素输出后,通过自增储存数列下标的变量i或j的值将该元素属于的数列往后取第二个元素和另一个数组的第一个元素继续比较最小的元素输出后,如此循环往复的遍历之后,直到某一个数列首先输出完之后退出循环。再用分支语句判断输出完的数列是第一个还是第二个之后,将另一个数组剩下的元素输出出来,然后这样就将两数列中的数据以从小到大的顺序全部输出出来。


代码展示

方法一 :集中于一数列的冒泡排序法(速度慢,两行数排列顺序可随机)

#include <stdio.h>
int main()
{
    int n = 0, m = 0, arr[2000] = { 0 };
    printf("Please enter the number of rows for two sequences:\n");
    scanf("%d%d", &n, &m);
    printf("Please enter the elements of two sequences separately:\n");
    for (int i = 0; i < n + m; i++)//两行作一行储存在一数列中
    {
        scanf("%d", &arr[i]);
    }
    int tmp = 0;
    for (int i = n + m - 1; i > 0; i--)//将该行数列中的数有小到大冒泡排序
    {
        for (int j = 0; j < i; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
    printf("The merged sequence in ascending order is:\n");//输出有小到大排序后的数列
    for (int i = 0; i < n + m; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

方法二 :两行数边遍历边比较取小元素输出法(速度快,两行必须小到大)

#include <stdio.h>
int main()
{
	int n = 0, m = 0, arr1[1000] = { 0 }, arr2[1000] = { 0 };
	printf("Please enter the number of rows for two sequences:\n");
	scanf("%d%d", &n, &m);
    printf("Please enter the elements of two sequences separately:\n");
	int i = 0, j = 0;
	for (; i < n; i++)//将第一行数据输入到数列1中
	{
		scanf("%d", arr1 + i);
	}
	for (; j < m; j++)//将第二行数据输入到数列2中
	{
		scanf("%d", arr2 + j);
	}
	i = 0;
	j = 0;
	int k = 0;
	printf("The merged sequence in ascending order is:\n");
	while (i < n && j < m)//运用具体逻辑中的方法将一个数列中的数据输出
	{
		if (arr1[i] < arr2[j])
		{
			printf("%d ", arr1[i++]);
		}
		else
		{
			printf("%d ", arr2[j++]);
		}
	}
	if (i == n)//运用分支语句判断输出的数列是哪一个后再将另一数列剩下的元素全部输出
	{
		for (; j < m; j++)
		{
			printf("%d ", arr2[j]);
		}
	}
	else
	{
		for (; i < n; i++)
		{
			printf("%d ", arr1[i]);
		}
	}
	return 0;
}

效果展现

效果展现


结语

以上就是我对有序序列合并这个项目的解题思路,代码以及效果展示,希望对你的C语言学习有所帮助!作为刚学编程的小白,可能在一些设计逻辑方面有些不足,欢迎评论区进行指正!看都看到这了,点个小小的赞或者关注一下吧(当然三连也可以~),你的支持就是博主更新最大的动力!让我们一起成长,共同进步!


  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值