啊我摔倒了..有没有人扶我起来学习....
题目
问:
输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
数据范围:1≤n
,m≤1000
,序列中的值满足0≤val≤30000
输入描述:
输入包含三行
第一行包含两个正整数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
解法
1. 确定思路
- 当然,有一个简单的思路,就是另外定义一个数组,把这两个序列的元素全部存进去,然后再进行排序
- 但是一旦涉及到排序,时间复杂的就会上去
- 这边提供一个思路,就是用空间换时间
- 先定义两个数组分别存储这两个序列,然后用两个指针分别遍历这两个数组,指针走一步比较一次各自指向的值的大小
- 谁指向的值小,就先把那个值打印出来,然后该指针
+1
,另外一个指针先不动,一次次进行比较
2. 编写代码
- 根据上述思路,直接用数字下标代替指针,对比索引值的大小,小的先打印,打印完下标
+1
对应代码:
if(a[x]<b[y])
{
printf("%d ",a[x]);
x++;
}
else
{
printf("%d ",b[y]);
y++;
}
- 一次一次对比...当其中一个下标遍历完数组后退出循环
对应代码:
while(x<n && y<m)
{
if(a[x]<b[y])
{
printf("%d ",a[x]);
x++;
}
else
{
printf("%d ",b[y]);
y++;
}
}
- 另外一个下标还得继续遍历打印数组,直接打完即可
对应代码:
if(x==n)
{
for(;y<m;y++)
printf("%d ",b[y]);
}
else
{
for(;x<n;x++)
printf("%d ",a[x]);
}
- 试试看最终的功能: