我写了这段代码。
#include<iostream>
using namespace std;
int main()
{int n1,n2;
cin>>n1>>n2;
int arr1[n1],arr2[n2];
for (int i=0;i<n1;i++)
cin>>arr1[i];
for (int j=0;j<n2;j++)
cin>>arr2[j];
int arr3[n1+n2],c1=0,c2=0,c3=0;
while (c1<n2 & c2<n2)
{if (arr1[c1]<=arr2[c2])
{arr3[c3]=arr1[c1];
c1++;
c3++;
}
else { arr3[c3]=arr2[c2];
c2++;
c3++;
}
while (c1<n1)
{arr3[c3]=arr1[c1];
c1++;
c3++;
}
while (c2<n2)
{arr3[c3]=arr2[c2];
c2++;
c3++;
}
}
for (int g=0;g<n1+n2;g++)
cout<<arr3[g];
return 0;
}
但它没有提供所需的输出。 当我在Java中看到相同的代码时,它被赋予相同的算法。 这段代码有什么问题?
答案 0 :(得分:0)
合并两个已排序的向量相对简单。这是一个伪代码示例,它将按升序排列两个向量,并按升序合并到另一个向量中。
Input: Sorted arrays A, B
Output: Merged array C
while((iterator on A is valid)&&(iterator on B is valid)):
if (elem in A < elem in B):
insert elem in A into C
increment iterator on A
else:
insert elem in B into C
increment iterator on B
while (iterator on A is valid):
insert element in A into C
increment iterator on A
while (iterator on B is valid):
insert element in B into C
increment iterator on B
return C
第一个循环遍历A和B的元素,将最小的元素复制到C中,直到它们中的至少一个耗尽。一旦我们知道我们已经处理了至少一个列表中的所有元素,我们只想将另一个列表的其余元素复制到C.这就是底部两个循环所做的。
编辑:
稍微查看一下代码后,代码的一些特定问题可能来自第一个循环。您使用按位AND而不是逻辑AND。
arr3的声明也是错误的。 C ++只允许使用编译时常量进行数组大小初始化。 See This post有关该问题的更深入描述。