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

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

写在最后

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

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

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
合并两个升序数组时,可以使用双指针法来实现。具体步骤如下: 1. 创建一个新的数组,用于存储合并后的结果。 2. 初始化两个指针,分别指向两个数组的起始位置。 3. 比较两个指针所指向的元素,将较小的元素添加到新数组中,并将对应指针向后移动一位。 4. 重复步骤3,直到其中一个数组的元素全部添加到新数组中。 5. 将剩余未添加的数组元素依次添加到新数组中。 6. 返回合并后的新数组。 下面是一个示例的C语言函数实现: ```c #include <stdio.h> void mergeArrays(int arr1[], int size1, int arr2[], int size2, int merged[]) { int i = 0, j = 0, k = 0; while (i < size1 && j < size2) { if (arr1[i] < arr2[j]) { merged[k++] = arr1[i++]; } else { merged[k++] = arr2[j++]; } } while (i < size1) { merged[k++] = arr1[i++]; } while (j < size2) { merged[k++] = arr2[j++]; } } int main() { int arr1[] = {1, 3, 5, 7}; int size1 = sizeof(arr1) / sizeof(arr1[0]); int arr2[] = {2, 4, 6, 8}; int size2 = sizeof(arr2) / sizeof(arr2[0]); int merged[size1 + size2]; mergeArrays(arr1, size1, arr2, size2, merged); printf("Merged array: "); for (int i = 0; i < size1 + size2; i++) { printf("%d ", merged[i]); } return 0; } ``` 这个函数接受两个升序数组和它们的大小作为参数,然后将合并后的结果存储在一个新的数组中。在主函数中,我们定义了两个升序数组,并调用了mergeArrays函数进行合并。最后,打印出合并后的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值