输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
数据范围:
, 序列中的值满足 
输入包含三行,
第一行包含两个正整数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
int main() { int num1 = 0; int num2 = 0; int nums1[1000]; int nums2[1000]; int sums[2001]; scanf("%d %d", &num1, &num2); int i = 0; int j = 0; int n = 0; n = num1 + num2; for (i = 0; i < num1; i++) { scanf("%d", &nums1[i]); } for (i = 0; i < num2; i++) { scanf("%d", &nums2[i]); } for (i = 0; i < num1; i++) { sums[i] = nums1[i]; } for (i = 0; i < num1+num2; i++) { sums[num1 + i] = nums2[i]; } int t = 0; for (i = 0; i < num1 + num2 - 1; i++) { for (j = 0; j < num1 + num2 - 1 - i; j++) { if (sums[j] > sums[j + 1]) { t = sums[j]; sums[j] = sums[j + 1]; sums[j + 1] = t; } } } for (i = 0; i < num1 + num2; i++) { printf("%d ", sums[i]); } return 0; }创建3个数组,把12数组赋值到数组3,再冒泡排序
#include <stdio.h> int main() { int a, b; scanf("%d %d",&a,&b); int arr1[1000] = {0}; int arr2[1000] = {0}; int arr3[1000] = {0}; //接收第一组数组 for(int i = 0;i<a;i++) { scanf("%d ",arr1+i); } //接收第二组数组 for(int j = 0;j<b;j++) { scanf("%d ",arr2+j); } //合并两个数组 for(int m = 0;m<a+b;m++) { if(m<a) { arr3[m] = arr1[m]; } else { int n = m-a; arr3[m] = arr2[n]; } } //冒泡排序 for(int q = a+b-1;q>0;q--) { for(int w = 0;w<q;w++) { if(arr3[w]>arr3[w+1]) { int tmp = arr3[w]; arr3[w] = arr3[w+1]; arr3[w+1] = tmp; } } } //打印 for(int e = 0;e<a+b;e++) { printf("%d ",arr3[e]); } return 0; }
#include<stdio.h> void My_scanf(int arr[], int x) //输入 { int i = 0; for(i=0;i<x;i++) { scanf("%d ",&arr[i]); } } void Sort(int arr3[],int n) //冒泡排序 { int i = 0; int j = 0; int g = 0; int temp = 0; for(i = 0; i< n-1;i++) { for(j=i+1;j<n;j++) { if(arr3[i]> arr3[j]) { temp = arr3[i]; arr3[i] = arr3[j]; arr3[j] = temp; } } } } void combine(int arr1[],int arr2[],int arr3[],int n,int m)//合并两个数组 { int i = 0; int j = 0; for(i=0;i<n;i++) { arr3[i]=arr1[i]; } for(j=0;j<m;j++) { arr3[j+n]=arr2[j]; } } void My_printf(int arr3[],int k)//输出 { int i = 0; for(i=0;i<k;i++) { printf("%d ",arr3[i]); } } int main() { int n =0; int m = 0; scanf("%d %d",&n,&m); int arr1[n]; int arr2[m]; int arr3[n+m]; My_scanf(arr1,n); My_scanf(arr2,m); combine(arr1,arr2,arr3,n,m); Sort(arr3,n+m); My_printf(arr3,n+m); return 0; }
#include <stdio.h> int main() { int n=0, m=0; int i=0,j=0; scanf("%d %d",&n,&m); int arr[30000]={0}; for(int i=0;i<n+m;i++){ scanf("%d",&arr[i]); } //排序,排成升序 for(i=0;i<n+m-1;i++){//比较的趟数 for(j=0;j<n+m-1-i;j++){//每一趟比较的对数 int tmp=0; 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]); if(i<n+m-1){//如果不是最后一个元素,打印空格 printf(" "); } } return 0; }
#include<stdio.h> int main() { int n = 0; int m = 0; scanf("%d %d", &n, &m); int arr1[1001] = { 0 }; int arr2[1001] = { 0 }; int merged[2002] = { 0 }; for (int i = 0; i < n; i++)//输入第一行的n个元素 { scanf("%d", &arr1[i]); } for (int i = 0; i < m; i++)//输入第二行的m个元素 { scanf("%d", &arr2[i]); } int i = 0; int j = 0; int k = 0; while (i < n && j < m)//由于题目中的两个数组是升序排列,右值一定大于左值,所以该循环最终的结果会以遇到某数组中一个巨大的值为上限,将另一数组遍历排序完 { if (arr1[i] < arr2[j]) //升序排列两数组中的元素,当一组数据被彻底遍历完之后,另一组剩下的只有一些更大的值 { merged[k++] = arr1[i++]; } else { merged[k++] = arr2[j++]; } } //补漏,将上限值及其升序排列的所有右值添加到merged中 while (i < n) //当arr1里面还有值,陆续放到merged中 { merged[k++] = arr1[i++]; } while (j < m) //当arr2里面还有值,陆续放到merged中 { merged[k++] = arr2[j++]; } //如果题目改成无序数组,另加一个冒泡排序即可 // 输出合并后的序列 for (int l = 0; l < k; l++) { printf("%d ", merged[l]); } printf("\n"); return 0; }
#include <stdio.h> int main() { int n, m; scanf("%d %d", &n, &m); int arr1[n], arr2[m], arr3[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 i = 0, j = 0, k = 0; while (i < n && j < m) { if (arr1[i] < arr2[j]) { arr3[k++] = arr1[i++]; } else { arr3[k++] = arr2[j++]; } } while (i < n) { arr3[k++] = arr1[i++]; } while (j < m) { arr3[k++] = arr2[j++]; } for (int i = 0; i < k; i++) { printf("%d ", arr3[i]); } return 0; }