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

题目:

描述

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

            

输入描述:

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

                 

输出描述:

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

                    

 =========================================================================

                       

思路:

总体思路:

(一).

输入 n m

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

变长数组进行赋值

                    

(二).

进行合并
定义第三个变长数组 arr3 ,分别定义三个数组的下标 ijk

使用 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;
}

实现图片:

                 


                 

第二步:

开始合并:

              

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

              

(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;
}

实现图片:

                 


                 

第三步:

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

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

此时 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;
}

实现图片:

                    

最终代码和实现效果

最终代码:

#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;
}

实现效果:

猜你喜欢

转载自blog.csdn.net/weixin_63176266/article/details/131261167
今日推荐