3

こんにちは、ご列席の皆様。ですから、それは私の間違いの日ではありません。C ++でマージソート(インプレースではない)を実装しているのですが、コードに本当に問題があり、理由がわかりません。関数の最後から2番目の行は、mergeSort()の結果merge()をintのベクトルに割り当てますresult。この行(関数ではなく実際の割り当て)はbad_allocエラーをスローしますが、その理由はわかりません。

インターネットは、これは主にメモリ不足エラーが原因でスローされることを示唆してbad_allocいますが、最初に呼び出されたのは500 intのベクトルであるため、これは当てはまりません。 32ビット整数で2Kb?)私はC++に対して愚かで間違ったことをしていると思いますが、何が起こっているのかわかりません。what()例外を呼び出してみましたが、名前が返されます。コード:

vector<int> Sorting::mergeSort(vector<int> A) {

    // If the length of A is 0 or 1, it is sorted.
    if(A.size() < 2) return A;

    // Find the mid-point of the list.
    int midpoint = A.size() / 2;

    // Declare the left/right vectors.
    vector<int> left, right;

    // Declare the return vector.
    vector<int> result (A.size());

    for(int i = 0; i < midpoint; ++i) {
        left.push_back(A.at(i));
    }

    for(int i = midpoint; i < A.size(); ++i) {
        right.push_back(A.at(i));
    }

    left = mergeSort(left);
    right = mergeSort(right);
    result = merge(left, right);

    return result;

}


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

    vector<int> result;

    while(left.size() > 0 && right.size() > 0) {

        if(left.front() <= right.front()) {
            result.push_back(left.front());
            left.erase(left.begin());
        } else {
            result.push_back(right.front());
            right.erase(right.begin());
        }
    }

    if(left.size() > 0) {
        for(int i = 0; i < left.size(); ++i) {
            result.push_back(left.at(i));
        }
    } else {
        for(int i = 0; i < right.size(); ++i) {
            result.push_back(right.at(i));
        }
    }

}

関数を書き直して、merge関数の参照を取得してresult編集するだけで問題なく動作しますが、コードをマージソート用に指定された「標準」の疑似コードにできるだけ近づけたいと思いました。

助けてくれてありがとう。

4

1 に答える 1

3

Merge関数では、vector<int> resultは返されていません。

于 2010-08-15T16:36:22.563 に答える