【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两个数组重合部分的比较

        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 剩余元素的比较、打印数组

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

        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]);

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

写在最后

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

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

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

猜你喜欢

转载自blog.csdn.net/weixin_70218204/article/details/132131616