问题概述:
输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
输入包含三行
第一行包含两个正整数n, m,用空格分隔。
n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数,用空格分隔。
第三行包含m个整数,用空格分隔。
输出为一行,输出长度为n + m的升序序列,
即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。
目录
一.思路解析:
1.我们可以把输入的两组数据放到同一数组中,之后使用冒泡排序法将元素升序排列就可以解决问 题了。
2.输入数组元素可以循环
3.冒泡排序实现有序序列合并
二.代码实现:
一.循环输入数组元素:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int n = 0;
int m = 0; //n和m表示第二行和第三行分别有n个元素和m个元素
int arr[200] = { 0 };
scanf("%d %d", &n, &m);
int i = 0;
while (i != n + m) //把所有元素放在同一个数组中,一个就有n+m个元素,
{
if (i < n) //题目要求第二行输入n个元素
{
scanf("%d", &arr[i]);
}
else //第二行输入完剩下都是第三行的元素了
{
scanf("%d", &arr[i]);
}
i++;
}
for (i = 0; i < n + m; i++) //打印演示是否正确放入数组中
{
printf("%d ", arr[i]);
}
return 0;
}
二.冒泡排序实现有序序列合并:
int t = 0;
for (i = 0; i < n + m - 1; i++) //第一个for是每次循环将最大的元素放在最后,
{ //循环n+m-1次是因为最小的元素不需要比较两个元素比较,只需要比较一次
int j = 0;
for (j = 0; j < n + m - 1; j++) //第二个for是比较相邻两个元素的大小,前面的大就交换
{ //循环n+m-1次是因为arr[j+1],下标为j+1
if (arr[j] > arr[j + 1])
{
t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
三.所有代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
int arr[200] = { 0 };
scanf("%d %d", &n, &m);
int i = 0;
while (i != n + m)
{
if (i < n)
{
scanf("%d", &arr[i]);
}
else
{
scanf("%d", &arr[i]);
}
i++;
}
int t = 0;
for (i = 0; i < n + m - 1; i++) //第一个for是每次循环将最大的元素放在最后,
{ //循环n+m-1次是因为最小的元素不需要比较两个元素比较,只需要比较一次
int j = 0;
for (j = 0; j < n + m - 1; j++) //第二个for是比较相邻两个元素的大小,前面的大就交换
{ //循环n+m-1次是因为arr[j+1],下标为j+1
if (arr[j] > arr[j + 1])
{
t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
for (i = 0; i < n + m; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
三.结语+美图分享:
结语:祝你六一儿童节快乐!希望你的心中充满梦想和希望,在成长的道路上遇到更多美好的事情,一直走得顺风顺水.