在代码的题目中,我们有时会遇到需要将两个数列合并排序的情况,那么今天博主就带大家一起学习如何进行这样的排序
1. 原题目:
输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
输入描述:
输入包含三行,第一行包含两个正整数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
2. 思路:
既然两个数组已经是有序的,那就可以按照顺序,不断地比较两个数组中的最小值,然后放到一个新的空数组里,最后再打印排好顺序的新数组即可。
3. 代码实现
3.1两个数组重合部分的比较
int i = 0;
int j = 0;
int k = 0;
int n = 0;
int m = 0;
int r = 0;
scanf("%d %d",&n,&m);
int arrn[n];//第一个数组
int arrm[m];//第二个数组
int arr[n+m];//新数组
for(i=0;i<n;i++)//输入第一个数组数值
{
scanf("%d",&j);
arrn[i] = j ;
}
for(i=0;i<m;i++)//输入第二个数组数值
{
scanf("%d",&j);
arrm[i] = j ;
}
j=0;
i=0;
while(k<m&&j<n)
{
if(arrn[j]<arrm[k])
{
arr[i++]=arrn[j++];//在将最小值赋到新数组后,两个数组下标同时+1,重新判断n数组和m数组哪个最小值更小
}
else
{
arr[i++]=arrm[k++];//同理
}
}
3.2 剩余元素的比较、打印数组
但是,当其中一个数组已经被排序完了,另一个数组仍然可能留有一些元素没有赋值到新数组中,所以这时需要将剩下的元素进行赋值。
if (k==m)//当k==m的时候,就是下标已经达到原来设计的数组大小,说明m的数组的元素已经全部被拿走了,所以此时需要将n数组中剩下的元素进行赋值
{
while(j<n)
{
arr[i++]=arrn[j++];
}
}
else
{
while(k<m)
{
arr[i++]=arrm[k++];
}
}
for(i=0;i<n+m;i++)
printf("%d ",arr[i]);
如此一来,便可以将两个已经排好序的数列合并排序了,如果题目中没有明确要求放到新数组中,也可以直接打印出来,不用创建第三个新数组,这里就不再赘述。
写在最后
如果本文对您有帮助,可不可以给我一个小小的点赞呀❤~您的支持是我最大的动力。
博主小白一枚,才疏学浅,难免有所纰漏,欢迎大家讨论和提出问题,博主一定第一时间改正。
谢谢观看嘿嘿(๑•̀ㅂ•́)و✧~!