已有两个已排序(从小到大)的n个元素和m个元素的数组,将它们合并到一个从小到大的数组中。
#include <stdio.h>
#include <stdlib.h>
int main() {
int a[128] ;
int b[128] ;
int c[256];
//数据录入
int m,n,s;
printf("请输入第一个数组的元素个数:");
scanf("%d",&m);
for(s=0; s<m; s++) {
printf("请输入第%d个元素:",s+1);
scanf("%d",&a[s]);
}
printf("请输入第二个数组的元素个数:");
scanf("%d",&n);
for(s=0; s<n; s++) {
printf("请输入第%d个元素:",s+1);
scanf("%d",&b[s]);
}
//数据转移
int i=0,j=0,k=0;
while(i<m && j<n) {
if(a[i]<=b[j]) { //比较,此过程会留下部分数据未录入
c[k++]=a[i++];
} else {
c[k++]=b[j++];
}
}
//第二组数组剩下的部分必然比已排序好的大,必然比第一组数组剩下的部分小
//第一组数组剩下的部分必然比前面所有数大,所以留在最后导入
//题目前提很重要:输入的一定是两个排好序的数组!
for(j; j<n; j++) {
c[k++]=b[j]; //导入第二个数组剩下的部分
}
for(i; i<m; i++) {
c[k++]=a[i]; //导入第一个数组剩下的部分
}
//遍历
for(i=0; i<m+n; i++) {
printf("%-3d",c[i]);
}
return 0;
}
例子:a[4] = {1,3,5,7} b[4] = {2,4,6,8}
第一次:a[0] < b[0] ; c[0] = a[0] = 1;此后k=1,i=1;
第二次:a[1] > b[0] ; c[1] = b[0] = 2;此后k=2,j=1;
第三次:a[1] < b[1] ; c[2] = a[1] = 3;此后k=3,i=2;
第四次:a[2] > b[1] ; c[3] = b[1] = 4;此后k=4,j=2;
第五次:a[2] < b[2] ; c[4] = a[2] = 5;此后k=5,i=3;
第六次:a[3] > b[2] ; c[5] = b[2] = 6;此后k=6,j=3;
第七次:a[3] < b[3] ; c[6] = a[3] = 6;此后k=7;i=4;
在第七次时,i=4,while循环结束,此时,留下了第二组的残余数据 8 ,在后面进行导入后,将新数组遍历输出。
其他情况暂不展开讨论,如有纰漏欢迎斧正。