在C ++中遇到合并函数算法的问题

时间:2015-02-28 21:22:52

标签: c++ arrays algorithm merge array-merge

我一直试图弄清楚这两个函数现在调用一段时间可能会出现什么问题,似乎无法识别它。当我在show函数之前调用merge函数时,它工作正常并合并两个数组然后显示它们否则,如果我在任何其他函数之后调用merge函数(例如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

1 个答案:

答案 0 :(得分:2)

merge功能中有undefined behavior,因为您没有初始化ij个变量。这意味着他们的价值是不确定(实际上看似随机)。

当声明变量时,你需要分别初始化每个变量,你不能像现在这样做,并希望所有变量都被初始化。

改变
unsigned i,j,k = 0;

unsigned i = 0, j = 0, k = 0;