在 C++ 中使用合并函数算法时遇到问题
Having trouble with merge function algorithm in C++
一段时间以来,我一直在试图弄清楚调用这两个函数可能出了什么问题,但似乎无法识别。当我在 show 函数之前调用合并函数时,它工作正常并合并两个数组然后显示它们否则,如果我在任何其他函数之后调用合并函数(例如 show(a,els) 和 show(b, els)), 合并函数不起作用并输出合并数组中的所有零。任何想法都会很有帮助。
int main(){
const unsigned els = 5;
unsigned a[els] = {1,2,3,4,5};
unsigned b[els] = {1,2,3,4,4};
unsigned combo[(els*2)];
show( a, els);
show( b, els);
merge( combo, a, els, b, els);
show( combo, els*2);
return 0;
}
void show( const unsigned a[], unsigned elements ){
cout << "[" << elements << "]: ";
for ( unsigned i = 0; i < elements; i++)
{
cout << a[i]; //Outputting contents of array
if(i != elements-1)
cout << ",";
}
cout << endl;
}
void merge( unsigned combo[], const unsigned a[], unsigned aElements, const
unsigned b[], unsigned bElements ){
string notsort(" Array is not sorted");
if((!sorted(a, aElements)) || (!sorted(b, bElements)))
die(notsort);
unsigned i,j,k = 0;
while(i < aElements && j < bElements){
if(a[i] <= b[j]){
combo[k]= a[i];
i++;
} else {
combo[k] = b[j];
j++;
}
k++;
}
if(i < aElements){
for(int x = i; x < aElements; x++){
combo[k] = a[x];
k++;
}
}else{
for(int x = j; x < bElements; x++){
combo[k] = b[x];
k++;
}
}
}
a 和 b 显示后带合并功能的输出:
[5]: 1,2,3,4,5
[5]: 1,2,3,4,4
[10]: 0,0,0,0,0,0,0,0,0,0
在 a 和 b 显示之前使用合并功能输出:
[10]:1,1,2,2,3,3,4,4,4,5
[5]: 1,2,3,4,5
[5]: 1,2,3,4,4
您在 merge
函数中有 undefined behavior,因为您没有初始化 i
或 j
变量。这意味着它们的值是 indeterminate(实际上看起来是随机的)。
在声明变量的时候,需要分别初始化每个个变量,不能像现在这样,希望所有的变量都被初始化。
所以从
unsigned i,j,k = 0;
到
unsigned i = 0, j = 0, k = 0;
一段时间以来,我一直在试图弄清楚调用这两个函数可能出了什么问题,但似乎无法识别。当我在 show 函数之前调用合并函数时,它工作正常并合并两个数组然后显示它们否则,如果我在任何其他函数之后调用合并函数(例如 show(a,els) 和 show(b, els)), 合并函数不起作用并输出合并数组中的所有零。任何想法都会很有帮助。
int main(){
const unsigned els = 5;
unsigned a[els] = {1,2,3,4,5};
unsigned b[els] = {1,2,3,4,4};
unsigned combo[(els*2)];
show( a, els);
show( b, els);
merge( combo, a, els, b, els);
show( combo, els*2);
return 0;
}
void show( const unsigned a[], unsigned elements ){
cout << "[" << elements << "]: ";
for ( unsigned i = 0; i < elements; i++)
{
cout << a[i]; //Outputting contents of array
if(i != elements-1)
cout << ",";
}
cout << endl;
}
void merge( unsigned combo[], const unsigned a[], unsigned aElements, const
unsigned b[], unsigned bElements ){
string notsort(" Array is not sorted");
if((!sorted(a, aElements)) || (!sorted(b, bElements)))
die(notsort);
unsigned i,j,k = 0;
while(i < aElements && j < bElements){
if(a[i] <= b[j]){
combo[k]= a[i];
i++;
} else {
combo[k] = b[j];
j++;
}
k++;
}
if(i < aElements){
for(int x = i; x < aElements; x++){
combo[k] = a[x];
k++;
}
}else{
for(int x = j; x < bElements; x++){
combo[k] = b[x];
k++;
}
}
}
a 和 b 显示后带合并功能的输出:
[5]: 1,2,3,4,5
[5]: 1,2,3,4,4
[10]: 0,0,0,0,0,0,0,0,0,0
在 a 和 b 显示之前使用合并功能输出:
[10]:1,1,2,2,3,3,4,4,4,5
[5]: 1,2,3,4,5
[5]: 1,2,3,4,4
您在 merge
函数中有 undefined behavior,因为您没有初始化 i
或 j
变量。这意味着它们的值是 indeterminate(实际上看起来是随机的)。
在声明变量的时候,需要分别初始化每个个变量,不能像现在这样,希望所有的变量都被初始化。
所以从
unsigned i,j,k = 0;
到
unsigned i = 0, j = 0, k = 0;