【C语言技巧】将两个数列合并排序

在代码的题目中,我们有时会遇到需要将两个数列合并排序的情况,那么今天博主就带大家一起学习如何进行这样的排序

文章目录

1. 原题目:

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

输入描述:

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

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

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

输出描述:

输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。

示例

输入:

5 6

1 3 7 9 22

2 8 10 17 33 44

输出:

1 2 3 7 8 9 10 17 22 33 44

2. 思路:

既然两个数组已经是有序的,那就可以按照顺序,不断地比较两个数组中的最小值,然后放到一个新的空数组里,最后再打印排好顺序的新数组即可。

3. 代码实现

3.1两个数组重合部分的比较

c 复制代码
        int i = 0;
        int j = 0;
        int k = 0;
        int n = 0;
        int m = 0;
        int r = 0;
        scanf("%d %d",&n,&m);
        int arrn[n];//第一个数组
        int arrm[m];//第二个数组
        int arr[n+m];//新数组
        for(i=0;i<n;i++)//输入第一个数组数值
        {
            scanf("%d",&j);
            arrn[i] = j ;
        }
        for(i=0;i<m;i++)//输入第二个数组数值
        {
            scanf("%d",&j);
            arrm[i] = j ;
        }
        j=0;
        i=0;
        while(k<m&&j<n)
        {
            if(arrn[j]<arrm[k])
            {
                arr[i++]=arrn[j++];//在将最小值赋到新数组后,两个数组下标同时+1,重新判断n数组和m数组哪个最小值更小
            }
            else
            {
                arr[i++]=arrm[k++];//同理
            }
        }

3.2 剩余元素的比较、打印数组

但是,当其中一个数组已经被排序完了,另一个数组仍然可能留有一些元素没有赋值到新数组中,所以这时需要将剩下的元素进行赋值。

c 复制代码
        if (k==m)//当k==m的时候,就是下标已经达到原来设计的数组大小,说明m的数组的元素已经全部被拿走了,所以此时需要将n数组中剩下的元素进行赋值
        {
            while(j<n)
            {
                arr[i++]=arrn[j++];
            }
        }
        else
        {
            while(k<m)
            {
                arr[i++]=arrm[k++];
            }
        }
        for(i=0;i<n+m;i++)
        printf("%d ",arr[i]);

如此一来,便可以将两个已经排好序的数列合并排序了,如果题目中没有明确要求放到新数组中,也可以直接打印出来,不用创建第三个新数组,这里就不再赘述。

写在最后

如果本文对您有帮助,可不可以给我一个小小的点赞呀❤~您的支持是我最大的动力。

博主小白一枚,才疏学浅,难免有所纰漏,欢迎大家讨论和提出问题,博主一定第一时间改正。

谢谢观看嘿嘿(๑•̀ㅂ•́)و✧~!

相关推荐
祖力554 小时前
数据结构的基本概念与单向链表(链表数据类型构造、创建、头插、尾插、头删、尾删)
数据结构·链表
大明者省6 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
WWJA王文举6 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
白狐_7987 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2588 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记8 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
qq_448011168 小时前
C语言中的动态内存分配
c语言·开发语言·php
杨航 AI8 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型9 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
动词ing9 小时前
【学习笔记】C语言(数组指针与指针数组+字符数组+函数+参数传递+字符串作为形参+递归函数+指针函数+回调函数+结构体嵌套+内存动态分配函数)
c语言·笔记·学习