【刷题】有序序列的合并

题目描述:

输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
输入描述:
输入包含三行,第一行包含两个正整数n,m(1<=n,m<=100),用空分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数(范围1~5000),用空格分隔。第三行包含m个整数(范围1~5000),用空格分隔。
输出描述:
输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。

具体实现:

#include 
int main()
{
    int n = 0;
    int m = 0;

    int arr1[100] = {0};
    int arr2[100] = {0};
    int arr3[200] = {0};    //用于存储重新排序的数组

    scanf("%d%d",&n,&m);
    
    //1、第一行有序序列输入
    for (int i = 0; i < n; i++)
    {
        scanf("%d",&arr1[i]);
    }

    //2、第二行有序序列输入
    for (int i = 0; i < m; i++)
    {
        scanf("%d",&arr2[i]);
    }

    //4、合并有序序列
    int i = 0;
    int j = 0;
    int k = 0;
    while (i<n && i<m)
    {
        //判断相对比的两个数组的两个元素大于哪个
        if (arr1[i] < arr2[j])
        {
            arr3[k++] = arr1[i++];  //赋值完之后,偏移到数组后一位,往后一个一个遍历
        }else
        {
            arr3[k++] = arr2[j++];  //赋值完之后,偏移到数组后一位,往后一个一个遍历
        }
    }

    //5、把剩下的元素直接追加到第三数组
    //如果i(arr1[100])遍历到最后一个,那么就直接把arr2[100]剩余的元素直接放进去就好了
    if (i == n)     //说明两组元素,已经有其中一组遍历到最后一个了
    {
        for (; j < m; j++)
        {
            arr3[k++] = arr2[j];   
        }        
    }else
    {
        for (; i < n; i++)
        {
            //把剩下的元素一个个追加到数组,同时K要++,i,for循环已经在++了
            arr3[k++] = arr1[i];    
        }
    }

    //6、输出合并后的数组
    for (i = 0; i < k; i++)
    {
        printf("%d ",arr3[i]);
    }
    printf("\n");

    return 0;
}

输出结果:

【刷题】有序序列的合并_第1张图片

总结:

这里排好序之后是采用第三个数组来进行存储的,如果只是为了输出,那么可以不用进行排序之后的存储,直接输出就可以了。

你可能感兴趣的:(数据结构,算法,vscode,c语言)