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

简介: 描述输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。 输入描述:输入包含三行, 第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。 第二行包含n个整数,用空格分隔。 第三行包含m个整数,用空格分隔。

题目:

描述

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

           

输入描述:

输入包含三行,

         

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

         

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

         

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

思路:

总体思路:

(一).

输入 n m

定义变长数组arr1 arr2(牛客网是支持变成数组的),

变长数组进行赋值

(二).


进行合并:

定义第三个变长数组 arr3 ,分别定义三个数组的下标 i、j、k ,


使用 while循环,arr1 和 arr2 都有值时进行合并,合并到 arr3,


使用 if条件判断语句 将 arr1 小于 arr2 的值赋给 arr3,调整两数组下标,


使用 else语句 将 等于 或 arr2 < arr1 的值赋给 arr3,调整两数组下标

(三).


进行完(二)中的步骤后,


跳出循环说明有一个数组已经遍历完了,


此时 i、j、k 下标都已经移动到了合适的位置,


先判断是哪个数组遍历完了:


如果 i == n,说明是 arr1 遍历完了,则把 arr2 中剩余的元素全部放入 arr3 中;


其它情况(j == m),说明是 arr2 遍历完了,则把 arr1 中剩余的元素全部放入 arr3 中。


进行打印

第一步:

(1). 输入n m

             

(2). 定义变长数组 arr1 arr2

             

(3). 对变长数组进行赋值

                   

实现代码:

#include <stdio.h>
int main() {
    //输入 n 和 m
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    //定义变长数组:
    int arr1[n];
    int arr2[m];
    //对变长数组进行赋值
    int i = 0;
    for (i = 0; i < n; i++)
    //前面输入的n就是arr1的长度
    {
        scanf("%d", &arr1[i]);
    }
    i = 0;
    for (i = 0; i < m; i++)
    //前面输入的m就是arr1的长度
    {
        scanf("%d", &arr2[i]);
    }
    return 0;
}

实现图片:

image.png

第二步:

开始合并:

            (1). 定义第三个变长数组arr3定义三个变长数组的下标ijk

             

(2).使用 while循环arr1 和 arr2 都有值时进行合并,合并到 arr3

(2).使用 while循环,arr1 和 arr2 都有值时进行合并,合并到 arr3,

(3).使用 if条件判断语句arr1 小于 arr2 的值赋给 arr3调整两数组下标

使用 else语句等于 或 arr2 < arr1 的值赋给 arr3调整两数组下标

                   

实现代码:

#include <stdio.h>
int main() {
    //输入 n 和 m
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    //定义变长数组:
    int arr1[n];
    int arr2[m];
    //对变长数组进行赋值
    int i = 0;
    for (i = 0; i < n; i++)
    //前面输入的n就是arr1的长度
    {
        scanf("%d", &arr1[i]);
    }
    i = 0;
    for (i = 0; i < m; i++)
    //前面输入的m就是arr1的长度
    {
        scanf("%d", &arr2[i]);
    }
    //开始合并:
    //定义第三个变长数组arr3,存放两arr1 和 arr2合并后的结果:
    int arr3[n + m]; //变长数组不能初始化
    //定义三个变长数组的下标:
    i = 0; //arr1下标
    int j = 0; //arr2下标
    int k = 0; //arr3下标
    //使用 while循环,
    while (i<n && j<m)
     //i<n:arr1下标小于arr1长度,说明arr1还有值
     //j<m:arr2下标小于arr2长度,说明arr2还有值
        //两个数组都有值才用进行比较赋值
    {
        if (arr1[i] < arr2[j]) //arr1的值小于arr2的值
        {
            arr3[k] = arr1[i]; //把大的值赋给arr3
            //给值 和 被给值 的数组下标都用往后移
            k++;
            i++;
        }
        else //等于时放谁都一样 或 arr2变得比较小了
        {
            arr3[k] = arr2[j]; //把大的值赋给arr3
            //给值 和 被给值 的数组下标都用往后移
            k++;
            j++;
        }
    }
    return 0;
}

实现图片:

image.png

第三步:

进行完(二)中的步骤后,

跳出循环说明有一个数组已经遍历完了

此时 i、j、k 下标都已经移动到了合适的位置,


       


(1). 先判断是哪个数组遍历完了:


如果 i == n,说明是 arr1 遍历完了,则把 arr2 中剩余的元素全部放入 arr3 中;


其它情况(j == m),说明是 arr2 遍历完了,则把 arr1 中剩余的元素全部放入 arr3 中。


           


(2). 进行打印

实现代码:

#include <stdio.h>
int main() {
    //输入 n 和 m
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    //定义变长数组:
    int arr1[n];
    int arr2[m];
    //对变长数组进行赋值
    int i = 0;
    for (i = 0; i < n; i++)
        //前面输入的n就是arr1的长度
    {
        scanf("%d", &arr1[i]);
    }
    i = 0;
    for (i = 0; i < m; i++)
        //前面输入的m就是arr1的长度
    {
        scanf("%d", &arr2[i]);
    }
    //开始合并:
    //定义第三个变长数组arr3,存放两arr1 和 arr2合并后的结果:
    int arr3[n + m]; //变长数组不能初始化
    //定义三个变长数组的下标:
    i = 0; //arr1下标
    int j = 0; //arr2下标
    int k = 0; //arr3下标
    //使用 while循环,
    while (i < n && j < m)
        //i<n:arr1下标小于arr1长度,说明arr1还有值
        //j<m:arr2下标小于arr2长度,说明arr2还有值
           //两个数组都有值才用进行比较赋值
    {
        if (arr1[i] < arr2[j]) //arr1的值小于arr2的值
        {
            arr3[k] = arr1[i]; //把大的值赋给arr3
            //给值 和 被给值 的数组下标都用往后移
            k++;
            i++;
        }
        else //等于时放谁都一样 或 arr2变得比较小了
        {
            arr3[k] = arr2[j]; //把大的值赋给arr3
            //给值 和 被给值 的数组下标都用往后移
            k++;
            j++;
        }
    }
    //跳出循环说明有一个数组已经被遍历完了
    //此时,i、j、k 都已经移动到了合适的位置
    //判断哪个数组遍历完了进行操作:
    if (i == n) //arr1下标等于arr1数组长度,说明arr1遍历完了
    {
        //将arr2中剩余的元素全部放入arr3中:
        while (j < m)//arr2下标小于arr2数组长度就继续放
        {
            arr3[k] = arr2[j];
            k++;
            j++;
        }
    }
    else //arr2遍历完
    {
        //将arr1中剩余的元素全部放入arr3中:
        while (i < n)//arr1下标小于arr1数组长度就继续放
        {
            arr3[k] = arr1[i];
            k++;
            i++;
        }
    }
    //进行打印:
    for (i = 0; i < n + m; i++)
    {
        printf("%d ", arr3[i]);
    }
    return 0;
}


实现图片:


image.png

最终代码和实现效果

最终代码:

#include <stdio.h>
int main() {
    //输入 n 和 m
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    //定义变长数组:
    int arr1[n];
    int arr2[m];
    //对变长数组进行赋值
    int i = 0;
    for (i = 0; i < n; i++)
        //前面输入的n就是arr1的长度
    {
        scanf("%d", &arr1[i]);
    }
    i = 0;
    for (i = 0; i < m; i++)
        //前面输入的m就是arr1的长度
    {
        scanf("%d", &arr2[i]);
    }
    //开始合并:
    //定义第三个变长数组arr3,存放两arr1 和 arr2合并后的结果:
    int arr3[n + m]; //变长数组不能初始化
    //定义三个变长数组的下标:
    i = 0; //arr1下标
    int j = 0; //arr2下标
    int k = 0; //arr3下标
    //使用 while循环,
    while (i < n && j < m)
        //i<n:arr1下标小于arr1长度,说明arr1还有值
        //j<m:arr2下标小于arr2长度,说明arr2还有值
           //两个数组都有值才用进行比较赋值
    {
        if (arr1[i] < arr2[j]) //arr1的值小于arr2的值
        {
            arr3[k] = arr1[i]; //把大的值赋给arr3
            //给值 和 被给值 的数组下标都用往后移
            k++;
            i++;
        }
        else //等于时放谁都一样 或 arr2变得比较小了
        {
            arr3[k] = arr2[j]; //把大的值赋给arr3
            //给值 和 被给值 的数组下标都用往后移
            k++;
            j++;
        }
    }
    //跳出循环说明有一个数组已经被遍历完了
    //此时,i、j、k 都已经移动到了合适的位置
    //判断哪个数组遍历完了进行操作:
    if (i == n) //arr1下标等于arr1数组长度,说明arr1遍历完了
    {
        //将arr2中剩余的元素全部放入arr3中:
        while (j < m)//arr2下标小于arr2数组长度就继续放
        {
            arr3[k] = arr2[j];
            k++;
            j++;
        }
    }
    else //arr2遍历完
    {
        //将arr1中剩余的元素全部放入arr3中:
        while (i < n)//arr1下标小于arr1数组长度就继续放
        {
            arr3[k] = arr1[i];
            k++;
            i++;
        }
    }
    //进行打印:
    for (i = 0; i < n + m; i++)
    {
        printf("%d ", arr3[i]);
    }
    return 0;
}

实现效果:

83a5adb9f47e416d92b120cdfff1b5cc.png

相关文章
|
5天前
|
C语言
【C语言刷题系列】合并两个有序数组
【C语言刷题系列】合并两个有序数组
|
2月前
|
C语言
你知道C语言中实现有序序列并序输出的2种方法吗?
你知道C语言中实现有序序列并序输出的2种方法吗?
|
9天前
|
C语言
C语言----获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
C语言----获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
|
9天前
|
C语言
C语言--数组合并
C语言--数组合并
10 0
|
9天前
|
C语言
C语言-----输入10个数,对其从大到小进行排列
C语言-----输入10个数,对其从大到小进行排列
|
9天前
|
C语言
C语言----随机输入10个数,从小到大依次排列
C语言----随机输入10个数,从小到大依次排列
13 0
|
24天前
|
算法 C语言
数据结构和算法——归并排序(有序子列的归并、递归算法、非递归算法、思路图解、C语言代码)
数据结构和算法——归并排序(有序子列的归并、递归算法、非递归算法、思路图解、C语言代码)
13 0
|
2月前
|
C语言
c语言编程练习题:7-52 求简单交错序列前N项和
c语言编程练习题:7-52 求简单交错序列前N项和
37 0
|
2月前
|
C语言
c语言编程练习题:7-51 求奇数分之一序列前N项和
c语言编程练习题:7-51 求奇数分之一序列前N项和
37 0
|
2月前
|
C语言
【C语言】求一个整数的二进制序列中1的个数的三种方法
【C语言】求一个整数的二进制序列中1的个数的三种方法
19 0