输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
数据范围: , 序列中的值满足
输入包含三行,
第一行包含两个正整数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
#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; }
#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; }
#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; }
#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; }
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--]; } } }
#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; }
#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]<<" "; } }
#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; }
#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; }
#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; }
#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; }
#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; }
#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); } } }
#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; }
#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; }