合并两个排序的整数数组A和B变成一个新的数组。
先确定两个数组的大小,即确定数组中元素的个数,可以使用sizeof()函数。
起初的想法是再新建一个更大的数组,即空间大小为a和b的和。直接把所有的元素放到其中,然后再进行排序。最后输出的就是组合后的数组。
int size1,size2;
size1=sizeof(a)/4;
size2=sizeof(b)/4;
int s[size1+size2];
for(int i=0;i<size1+size2;i++){
if(i<size1){
s[i]=a[i];
}
if(i>=size2-1){
s[i]=b[i-size1];
}
}
for(int i=0;i<size1+size2-1;i++){ //冒泡排序
int temp;
for(int j=0;j<size1+size2-i-1;j++){
if(s[j]>s[j+1]){
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
for(int i=0;i<sizeof(a)/4+sizeof(b)/4-2;i++){
cout<<s[i]<<endl;
}
但是当数据量大是时候,这种方法耗时太大,并且因为两个分开的数组都是有序的,应该充分利用这一条件,虽然可以通过改变排序方式来改变时间复杂度,但又会消耗多余的空间,顾此失彼。
后来改用不先放到数组中,在放入的时候就进行判断,依次放入。这样充分利用了数组的有序性。
int sum,i,j;
i=sizeof(a)/4-1;
j=sizeof(b)/4-1;
sum=i+j;
int s[i+j];
while(sum>=0){
if(i>=0 && j>=0){
if(a[i]>b[j]){
s[sum]=a[i];
i--;sum--;
}else if(a[i]<b[j]){
s[sum]=b[j];
j--;sum--;
}else{
s[sum]=a[i];
s[sum-1]=b[j];
sum-=2;
a--;b--;
}
}else if(i>=0 && j<0){
s[sum--]=a[i--];
}else if(i<0 && j>=0){
s[sum--]=b[j--];
}
}
for(int i=0;i<sizeof(a)/4+sizeof(b)/4-2;i++){
cout<<s[i]<<endl;
}