趁着复习把课上的作业和代码上传上来嘿嘿嘿,这个系列的代码都是自己写的或者老师教学用的可能内存管理上有点小瑕疵,但是算法理解还是不错的!本系列所有代码在dev-cpp上可以跑通~
有序顺序表的并:
=输入
•1 <= m,n <= 106.
•-10000<= A1 <= … <= Am <= 10000
•-10000<= B1 <= … <= Bn <= 10000
=输出
m+n个数;用空格分开 (将输入的m+n个数按非递减顺序输出)
基本思想:采用重构法和二路归并,同时遍历a和b比较他们的大小然后插入较小的
#include <stdio.h>
const int maxn = 1000000;
int m, n;
int a[maxn + 1];
int b[maxn + 1];
int c[maxn * 2 + 1];
int main() {
scanf("%d%d", &m, &n);
for (int i = 0; i < m; i++) scanf("%d", &a[i]);
for (int i = 0; i < n; i++) scanf("%d", &b[i]);
//你需要完成这一段代码
int i=0;
int k=0;
int j=0;
int sum=m+n;
while(i<m&&j<n){
if(a[i]<b[j]){
c[k]=a[i];
k++;i++;
}
else{
c[k]=b[j];
k++;j++;
}
}
while(i<m){
c[k]=a[i];
i++;k++;
}
while(j<n){
c[k]=b[j];
k++;j++;
}
for (int i = 0; i < sum; i++)
printf("%d ", c[i]);
return 0;
}
二路归并的核心代码:
while(i<m&&j<n){
if(a[i]<b[j]){
c[k]=a[i];
k++;i++;
}
else{
c[k]=b[j];
k++;j++;
}
}
while(i<m){
c[k]=a[i];
i++;k++;
}
while(j<n){
c[k]=b[j];
k++;j++;
}
游标i和j,总有标k,满足条件的时候i或j往前走,k往前走……最后看谁还剩,i剩就怎么怎么样,j剩就怎么怎么样。
二路归并能降低时间复杂度,是多个数组条件遍历所常用的。