合并排序C ++编译错误

时间:2013-02-07 04:01:08

标签: c++ compiler-errors mergesort

我正在尝试实现一个合并排序函数,我得到一个编译器错误,上面写着“不匹配'运算符='”它出现在我的递归赋值left_list = mergesort(left_list)和同样的错误中以下行使用right_list。

如果我取出赋值并且只有mergesort(left_list)但它没有正确排序,它会正确编译。我认为我现在拥有它的方式应该正确合并排序,但鉴于它没有,或者错误与这些行有关,或者它在mergesort()或merge()函数的其他地方。

任何帮助都将不胜感激。

void mergesort(vector<int> &data) {

vector<int> left_list;
vector<int> right_list;

if ( data.size() <= 1 ) {
    return;
}

// creates a middle point to separate into 2 sub lists
int middle =  ( data.size() / 2 );

// create a list of elements to the left of middle
for ( int i = 0; i < middle; i++ ) {
    left_list.push_back(data[i]);
}

// create a list of elements to the right of middle
for ( unsigned int i = middle; i < data.size(); i++ ) {
    right_list.push_back(data[i]);
}

// break down the sub lists until they are of size 1
left_list = mergesort(left_list);
right_list = mergesort(right_list);

// merge the sublists in the correct order
merge(left_list, right_list);



}

vector<int> merge(vector<int> &left, vector<int> &right) {

vector<int> result;

unsigned left_it = 0;
unsigned right_it = 0;

while( left_it < left.size() && right_it < right.size() ) {


    // the smaller value is put into the result vector
    if( left[left_it] < right[right_it] ) {

        result.push_back(left[left_it]);
        left_it++;
    }
    else
    {
        result.push_back( right[right_it] );
        right_it++;
    }
}

// Put the rest of the data from both vectors onto result
while( left_it < left.size() ) {

    result.push_back( left[left_it] );
    left_it++;
}

while( right_it < right.size() ) {

    result.push_back( right[right_it] );
    right_it++;
}

return result;

}

1 个答案:

答案 0 :(得分:1)

您的代码尝试接受mergesort函数的返回值。如果这就是你想要的,我原来的答案就是这样的。但是,如果mergesort应该使用排序结果更新输入参数,那么它不需要返回任何值,void就可以了。然后,获取其返回结果的赋值语句出错,应该更改。

mergesort(left_list);
mergesort(right_list);

但是,对merge的调用需要将结果分配给输入参数。

data = merge(left_list, right_list);

我的原始答案如下:

您应该更改mergesort函数以返回merge返回的相同类型。

vector<int> mergesort(vector<int> &data) {

然后,您需要更新mergesort实现,以便第一个return语句返回输入参数:

return data;

应该更改最后一个语句以返回结果:

return merge(left_list, right_list);

我还没有看过算法本身的实现。