首页 > 试题广场 >

有序序列合并

[编程题]有序序列合并
  • 热度指数:76554 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。

数据范围: , 序列中的值满足

输入描述:
输入包含三行,

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

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

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


输出描述:
输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。
示例1

输入

5 6
1 3 7 9 22
2 8 10 17 33 44

输出

1 2 3 7 8 9 10 17 22 33 44
代码为C语言
我的思路:
        有参考,定义三个数组,分别是要合并的和用于合并的,通过一个while循环实现小合并,然后通过两个带判断性质的while循环将剩下的元素储存到合并数组中,最终遍历数组并输出。
#include <stdio.h>
#include <math.h>
#include <string.h>
int main()
{
    int n,m,A=0,B=0,C=0,flag=0;//定义一些后面要用到的整形变量
    scanf("%d%d",&n,&m);
    int a[n],b[m],c[m+n];//定义储存数据的数组和合并后数组
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=0;i<m;i++)
    {
        scanf("%d",&b[i]);
    }
    while(A<n&&B<m)//第一次合并
    {
        if(a[A]<b[B])
        {
            c[C++]=a[A++];
        }
        else
        {
            c[C++]=b[B++];
        }
    }
    while(A<n)//补漏
    {
        c[C++]=a[A++];
    }
    while(B<m)
    {
        c[C++]=b[B++];
    }
    for(int i=0;i<m+n;i++)//遍历输出
    {
        printf("%d ",c[i]);
    }
    return 0;
}

发表于 2021-01-03 09:50:12 回复(0)
我们只用一个容器set就可以搞定这个题。前面的题介绍过set的用法,不过这次用到的multiset和set是一样的性质和一样的用法,不过这俩的区别就是multiset允许有重复的元素存在(符合题意),而set不允许
#include<bits/stdc++.h>
using namespace std;
int main(){
    multiset<int> s;
    int n, m;
    cin >> n >> m;
    for(int i = 0, num; i < n; i++){
        cin >> num;
        s.insert(num);
    }
    for(int i = 0, num; i < m; i++){
        cin >> num;
        s.insert(num);
    }
    for(auto i : s)
        cout << i << " ";
    cout << endl;
    return 0;
}

发表于 2020-06-02 20:21:52 回复(2)

#include <stdio.h>
int main()
{
	int n = 0;
	int m = 0;
	int arr1[1000] = { 0 };
	int arr2[1000] = { 0 };
	scanf("%d %d", &n, &m);
	int i = 0;
	int j = 0;
	int tmp = 0;
	for (i = 0; i < n; i++)
	{
		scanf("%d", &arr1[i]);//给第一个数组赋值
	}
	for (i = 0; i < m; i++)
	{
		scanf("%d", &arr2[i]);//给第二个数组赋值
	}
	int arr[2000] = { 0 };//合并数组
	for(i=0;i<n+m;i++)
	{
		if (i < n)//i小于n时,给合并数组传arr1对应的值
		{
			arr[i] = arr1[i];
		}
		else
		{
			arr[i] = arr2[i-n];//i大于等于n且小于n+m时,给合并数组传arr2对应坐标的值
		}
	}
	//冒泡排序
	//共n+m个元素
	//要比n+m-1轮
	//每轮n+m-1-i次
	for (i = 0; i < n + m - 1; i++)
	{
		for (j = 0; j < n + m - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
	for (i = 0; i < n + m; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}


发表于 2023-01-26 15:45:46 回复(1)
#include <stdio.h>
int main()
{
    //看了其他人的,我这个可能更简单一点
    int m,n;
    scanf("%d %d",&m,&n);
    int i=0,j=0;
    int a[2000]={0};   //只建立一个数组,范围为2000
    for(i=0;i<m+n;i++)      //直接输入所有的数值
        scanf("%d",&a[i]);
    for(i=0;i<m+n-1;i++)      //直接对所以数值排序
    {
        for(j=0;j<m+n-i-1;j++)
        {
            if(a[j]>a[j+1])
            {
                int t;
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    for(i=0;i<m+n;i++) //打印
        printf("%d ",a[i]);
    return 0;
}
发表于 2022-04-29 16:23:22 回复(1)
#include<stdio.h>

int main(){
    int arrnm[5];
    int res[10000];
    int i=0,j=0,k=0,tem=0;
    scanf("%d %d",&arrnm[0],&arrnm[1]);
//输入
    while(scanf("%d",&res[i])!=EOF){
        i++;
        if(i==arrnm[1]){
            break;
        }
    }
//输入
    while(scanf("%d",&res[i])!=EOF){
        i++;
        if(i==arrnm[2]){
            break;
        }
    }
//排序
    for(j=0;j<arrnm[0]+arrnm[1];j++){
            if(res[j-1]>res[j]){
                tem=res[j-1];
                res[j-1]=res[j];
                res[j]=tem;
                j=-1;
            }
    }
//输出
    for(i=0;i<arrnm[0]+arrnm[1];i++){
        printf("%d ",res[i]);
    }
    return 0;
}

编辑于 2021-01-01 02:22:37 回复(0)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int m = sc.nextInt();
            //把合并后的数组都放到第一个数组里
            int[] arr1 = new int[n+m];
            int[] arr2 = new int[m];
            for (int i = 0; i < n; i++) {
                arr1[i] = sc.nextInt();
            }
            for (int i = 0; i < m; i++) {
                arr2[i] = sc.nextInt();
            }
            mergeSort(arr1,arr2,n-1,m-1);
            StringBuilder res = new StringBuilder();
            for (int i = 0; i < arr1.length; i++) {
                res.append(arr1[i]);
                if (i!=arr1.length-1)res.append(" ");
            }
            System.out.println(res.toString());
        }
    }
    //归并排序,合并数组1和数组2
    public static void mergeSort(int[] arr1,int[] arr2,int a,int b){
        if (arr2 == null || arr2.length == 0){
            return;
        }
        int tail = arr1.length-1;
        while(a>=0 && b >=0){
            if (arr1[a]>arr2[b]){
                arr1[tail--] = arr1[a--];
            }else{
                arr1[tail--] = arr2[b--];
            }
        }
        while(a>=0){
            arr1[tail--] = arr1[a--];
        }
        while(b>=0){
            arr1[tail--] = arr2[b--];
        }
    }
}

发表于 2020-09-23 14:49:09 回复(0)
#include <stdio.h>

int main()
{
    int n, m;
    int arr1[1000] = { 0 };//用包含 1000 个整数的数组初始化第一个升序序列
    int arr2[1000] = { 0 };//用包含 1000 个整数的数组初始化第二个升序序列

    scanf("%d %d", &n, &m);

    for (int i = 0; i < n; i++) {//输入第一个升序序列数组
        scanf("%d", &arr1[i]);
    }
    for (int i = 0; i < m; i++){//输入第二个升序序列数组
        scanf("%d", &arr2[i]);
    }

    int a = 0;
    int b = 0;
    //每次打印1个数,共n+m个数,于是用for循环打印n+m次
    for (int i = 0; i < n + m; i++)
    {
        //当第一个升序数组和第二个升序数组里还有数没用完时,比较大小并打印
        //(因为包含 1000 个整数的数组在第n/m个数后会变为零,所以要判断a是否小于n-1)
        if ((a <= (n-1)) && (b <= (m-1))){
            if(arr1[a] < arr2[b]){
                printf("%d ", arr1[a]);
                a++;
            }
            else{
                printf("%d ", arr2[b]);
                b++;
            }
        }
        //当第一个升序数组用完,第二个升序数组里没用完时,打印第二个升序数组
        else if((a > (n-1)) && (b <= (m-1))) {
            printf("%d ", arr2[b]);
            b++;
        }
        else if ((a <= (n-1)) && (b > (m-1))) {
            printf("%d ", arr1[a]);
            a++;
        }
    }
    return 0;
}
//如果看不懂就用编译软件调试并监视看一下过程
发表于 2024-03-02 21:34:07 回复(1)
#include <stdio.h>
int main()
{
    int m, n, i;
    int a[1000] = { 0 }, b[1000] = { 0 };
    scanf("%d %d", &n, &m);
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);
    for (i = 0; i < m; i++)
        scanf("%d", &b[i]);
    int x = 0, y = 0;
    while (y < m || x < n)
    {
        if (a[x] < b[y] && x < n)
        {
            printf("%d ", a[x]);
            x++;
        }
        else if (y < m)
        {
            printf("%d ", b[y]);
            y++;
        }
        else
        {
            printf("%d ", a[x]);
            x++;
        }
    }
    return 0;
}

发表于 2021-10-29 22:48:49 回复(1)
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a_len,b_len,a_num,b_num;
    
    cin>>a_len>>b_len;
    int a[a_len],b[b_len],he[a_len+b_len];
    //初始化数组a
    for(int i = 0;i<a_len;i++){
        cin>>a_num;
        a[i] = a_num;
    }
    //初始化数组b
    for(int i = 0;i<b_len;i++){
        cin>>b_num;
        b[i] = b_num;
    }
    //两个数组合并到一个数组he
    for(int j = 0;j<a_len+b_len;j++){
        if(j<a_len)
            he[j] = a[j];
        else
            he[j] = b[j-a_len];
    }
    //he数组排序
    sort(he,he+a_len+b_len);
    //打印he数组
    for(int m = 0;m<a_len+b_len;m++){
        cout<<he[m]<<" ";
    }
}

发表于 2020-10-01 13:18:34 回复(1)
#include <stdio.h>

int main()
{
	int i = 0, n = 0,m=0,j=0;
	scanf("%d%d", &n, &m);
	int arr[1000] = { 0 };
	int drr[1000] = { 0 };
	int crr[3000] = { 0 };
	//输入
	for (i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	for (i = 0; i < m; i++)
	{
		scanf("%d", &drr[i]);
	}
	int p = m + n;
    //判断三种情况
	if (m > n)
	{
		for (i = 0; i < p; i++)
		{
			if (i < n)
			{
				crr[i] = arr[i];
			}
			else
			{
				crr[i] = drr[j++];
			}
		}
	}
	if (m == n)
	{
		for (i = 0; i < p; i++)
		{
			if (i < n)
			{
				crr[i] = arr[i];
			}
			else
			{
				crr[i] = drr[i - m];
			}
		}
	}
	if (m < n)
	{
		for (i = 0; i < p; i++)
		{
			if (i < m)
			{
				crr[i] = drr[i];
			}
			else
			{
				crr[i] = arr[j++];
			}
		}
	}
    //冒泡排序
	for (i = 0; i < p; i++)
	{
		for (int j = 0; j < p - i - 1; j++)
		{
			if (crr[j] > crr[j + 1])
			{
				int temp = crr[j+1];
				crr[j+1] = crr[j];
				crr[j] = temp;
			}
		}
	}
	for (i = 0; i < p; i++)
	{
		printf("%d ", crr[i]);
	}
	return 0;
}

发表于 2024-08-20 19:21:57 回复(0)
#include <stdio.h>
int main() {
    int n,m,i,j;
    int arr1[1000],arr2[1000],arr3[2000];//创建三个数组,将n和m个数放入arr3,在进行冒泡排序
    scanf("%d %d", &n, &m);
    for(i=0;i<n;i++)
    {
        scanf("%d", &arr1[i]);
      arr3[i]=arr1[i];
    }
    for(j=0;j<m;j++)
    {
        scanf("%d", &arr2[j]);
        arr3[n+j]=arr2[j];
    }
    int a,b;
    for(a=0;a<n+m;a++)
    {
        int tmp=0;
        for(b=a;b<n+m;b++)
        {
            if(arr3[a]>arr3[b])
            {
                tmp=arr3[a];
                arr3[a]=arr3[b];
                arr3[b]=tmp;
            }
        }
    }
    for(int k=0;k<n+m;k++)
    {
        printf("%d ", arr3[k]);
    }
    return 0;
}
发表于 2024-06-07 11:48:58 回复(0)
#include <stdio.h>
#include<stdlib.h>

int com_int(const void* e1,const void* e2)
{
    return *(int*)e1-*(int*)e2;
}

void print(int pa[],int sz)
{
    int i=0;
    for(i=0;i<sz;i++)
    {
        printf("%d ",pa[i]);
    }
}

int main()
{
    int n=0;
    int m=0;
    int arr1[1000]={0};
    int arr2[1000]={0};
    int arr3[2000]={0};
    int i=0;
   
    scanf("%d %d",&n,&m);

    //输入第一组数
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr1[i]);
    }

    //输入第二组数
    for(i=0;i<m;i++)
    {
        scanf("%d",&arr2[i]);
    }

    //将前两组数据导入第三组
    for(i=0;i<n+m;i++)
    {
        if(i>=n)
        {
            arr3[i]=arr2[i-n];
        }
        if(i<n)//可与上面else
        {
            arr3[i]=arr1[i];
        }
    }
    qsort(arr3,n+m,sizeof(arr3[0]),com_int);
    print(arr3,n+m);

    return 0;
}
发表于 2024-05-29 15:25:32 回复(0)
#include <stdio.h>
//吃掉吃掉!统统吃掉!!!
int main() {
    int a[10000], b=0,c;
    scanf("%d",&c);
    scanf("%d",&c);
    while (scanf("%d", &a[b++]) != EOF) ;
    for(int i=0;i<b-1;i++){
        for(int j=0;j<b-1;j++){
            if(a[i]<a[j]){
                int t=a[j];
                a[j]=a[i];
                a[i]=t;
            }
        }
    }
    for(int i=0;i<b-1;i++)printf("%d ",a[i]);
    return 0;
}

发表于 2024-01-13 16:14:39 回复(0)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    int n, m, a, b;
    scanf("%d%d", &n, &m);//n,m为两个数组中整数的个数
    int num1[1000] = { 0 };
    int num2[1000] = { 0 };
    int i = 0, j = 0;
    for (i = 0; i < n; i++) 
        scanf("%d", &num1[i]);//输入第一个数组的元素
    for (i = 0; i < m; i++) 
        scanf("%d", &num2[i]);//输入第二个数组的元素
    i = 0;
    while (i < n && j < m)
    {
        if (num1[i] < num2[j] && i < n && j < m) 
            printf("%d ", num1[i++]);//如果第一个数组中的第一个元素小于第二个数组中的第一个元素,就输出第一个数组中的第一个元素,
        else                         //并将i+1,用第一个数组中的第二个元素与第二个数字中的第一个元素进行比较
            printf("%d ", num2[j++]);//否则,输出第二个数组中的第一个元素,并将第二个数组中的第二个元素与第一个数组中的第一个元素进行比较
    }
                                       //最后输出的是从小到大的两个数组中的经过比较的元素
    while (i < n) 
        printf("%d ", num1[i++]);//输出没有比较的元素
    while (j < m) 
        printf("%d ", num2[j++]);//输出没有比较的元素
    return 0;
}

发表于 2023-07-28 22:48:46 回复(0)
#include <stdio.h>
#include<stdlib.h>

int qsort_num(const void* e1,const void* e2)
{
    return *(int*)e1-*(int*)e2;
}
int main() {
    int n=0;
    int m=0;
    scanf("%d %d",&n, &m);
    int arr[n+m];
    int i=0;
    for(i=0;i<n+m;i++)
    {
        scanf("%d",&arr[i]);
    }
    qsort(arr,n+m,sizeof(arr[0]),qsort_num);
    for(i=0;i<n+m;i++)
    {
       printf("%d ",arr[i]);
    }

    return 0;
}


发表于 2023-07-28 14:47:13 回复(0)
#include <stdio.h>

int main()
{
  int a;
  int b;
  int arr1[1000];
  int arr2[1000];
  int sum[2000];
  scanf("%d %d",&a,&b);

  int i;
 
  for(i=0;i<a;i++)
  {  
   scanf("%d",&arr1[i]);
  }
  for(i=0;i<b;i++)
  {
    scanf("%d",&arr2[i]);
  }

  int j=0;
  int temp=0;
  for(i=0;i<a||j<b;)
  {
   
        if(i==a)
        {
            sum[temp]=arr2[j];
            temp++;
            j++;

        }
        else if(j==b)
        {
            sum[temp]=arr1[i];
            temp++;
            i++;
        }
        else if(arr1[i]<arr2[j])
        {
            sum[temp]=arr1[i];
            temp++;
            i++;
           
        }
        else if(arr1[i]==arr2[j])
        {
            sum[temp]=arr1[i];
            temp++;
            i++;
            sum[temp]=arr2[j];
            temp++;
            j++;
        }
        else if(arr1[i]>arr2[j])
        {
            sum[temp]=arr2[j];
            temp++;
            j++;
        }
           
       
       
   
  }
 
  for(i=0;i<a+b;i++)
  {
    printf("%d ",sum[i]);
  }
    return 0;
}
发表于 2023-05-13 16:57:54 回复(0)
#include <stdio.h>
int main()
{
    int n,m;
    int a[1000]={0};
    int b[1000]={0};
    int c[2000]={0};
   
    scanf("%d %d",&n,&m);
//输入数组
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=0;i<m;i++)
    {
        scanf("%d",&b[i]);
    }
//合并数组
    int tt=0;
    for(int i=0;i<n+m;i++)
    {
        if(i<n)
        {
            c[i]=a[i];
            tt=1+i;
        }
        else
        {
            c[i]=b[i-tt];
        }
    }
//冒泡排序
    for(int i=0;i<n+m-1;i++)
    {
        for(int j=0;j<n+m-i-1;j++)
        {
            int temp;
            if(c[j]>c[j+1])
            {
                temp=c[j];
                c[j]=c[j+1];
                c[j+1]=temp;
            }
        }
    }
//输出排序好的数组
    for(int i=0;i<n+m;i++)
    {
        printf("%d ",c[i]);
    }
    return 0;
}

发表于 2023-05-05 12:28:09 回复(0)
解法一:归并排序
#include <stdio.h>
#include <string.h>
int main() {
    int n,m,i,j,k;
    scanf("%d %d",&n,&m);
    int arr1[n],arr2[m],arr[m+n];
    memset(arr1,0,n*sizeof(int));
    memset(arr2,0,m*sizeof(int));
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr1[i]);
    }
    for(i=0;i<m;i++)
    {
        scanf("%d",&arr2[i]);
    }
    i=0;
    j=0;
    k=0;
    while(i<n&&j<m)
    {
        if(arr1[i]<arr2[j])
        {
            arr[k++]=arr1[i++];
        }
        else
        arr[k++]=arr2[j++];
    }
    while(i<n)
    arr[k++]=arr1[i++];
    while(j<m)
    arr[k++]=arr2[j++];
    for(int k=0;k<n+m;k++)
    printf("%d ",arr[k]);
}
解法二:计数排序
#include <stdio.h>
#include <string.h>
int main() {
    int n,m,i,j;
    scanf("%d %d",&n,&m);
    int arr[30001];
    memset(arr,0,30001*sizeof(int));
    for(i=0;i<m+n;i++)
    {
        int x;
        scanf("%d",&x);
        arr[x]++;
    }
    for(i=0;i<30001;i++)
    {
        for(j=arr[i];j>0;j--)
        {
            printf("%d ",i);
        }
    }

}


发表于 2023-02-28 15:28:48 回复(0)
#include <stdio.h>

//合并数组
//思路:先从头开始比较两个数组的大小,先打印小的,小的下标加一,大的下标不变
void merge(int a[], int b[],int x,int y)
{
	int i = 0;
	int j = 0;
	while (i < x && j < y)
	{
		if (a[i] > b[j])
		{
			printf("%d ", b[j]);
			j++;
		}
		else
		{
			printf("%d ",a[i]);
			i++;
		}
		//打印剩下的数
		//判断谁先打印完
		if (j < y && i == x)
		{
			for (int k = j; j < y; j++)
			{
				printf("%d ", b[j]);
			}
		}
		if (i < x && j == y)
		{
			for (int k = i; i < x; i++)
			{
				printf("%d ", a[i]);
			}
		}


	}
}

int main()
{
	int a[1000] = { 0 };
	int b[1000] = { 0 };
	int x = 0;
	int y = 0;
	scanf("%d", &x);
	scanf("%d", &y);
	for (int i = 0; i < x; i++)
	{
		scanf("%d", &a[i]);
	}
	for (int j = 0; j < y; j++)
	{
		scanf("%d", &b[j]);
	}
	merge(a, b, x, y);

	return 0;
}


发表于 2023-02-23 20:58:51 回复(0)
#include <stdio.h>
int main()
{
	int m = 0, n = 0, i = 0, j = 0, k = 0;
	int arr1[2000] = { 0 };
	scanf("%d %d", &m, &n);
	k = m + n;
	for (i = 0; i < m; i++)
	{
		scanf("%d", &arr1[i]);
	}
	for (i = m; i < k; i++)
	{
		scanf("%d", &arr1[i]);
	}
	for (i = 0; i < k; i++)
	{
		for (j = i + 1; j < k; j++)
		{
			if (arr1[i] > arr1[j])
			{
				int temp = arr1[i];
				arr1[i] = arr1[j];
				arr1[j] = temp;
			}
		}
	}
	for (i = 0; i < k; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

发表于 2022-11-21 09:25:04 回复(0)