2

マージソート関数を実装しようとすると、「'operator ='に一致しない」というコンパイラエラーが発生します。これは、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;

}
4

1 に答える 1

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);

アルゴリズム自体の実装は見ていません。

于 2013-02-07T04:09:22.193 に答える