Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 合并排序算法的实现_C++ - Fatal编程技术网

C++ 合并排序算法的实现

C++ 合并排序算法的实现,c++,C++,我正在实现一个合并排序算法,并且在合并算法中收到一个std::bad_alloc,使用cerr语句,我发现我的错误在合并算法的第一个循环中。然而,我无法找出问题所在 vector<int> VectorOps::mergeSort(vector<int> toSort) { if(toSort.size() <= 1) { return toSort; } vector<int> left; ve

我正在实现一个合并排序算法,并且在合并算法中收到一个std::bad_alloc,使用cerr语句,我发现我的错误在合并算法的第一个循环中。然而,我无法找出问题所在

vector<int> VectorOps::mergeSort(vector<int> toSort)
{
    if(toSort.size() <= 1)
    {
        return toSort;

    }
    vector<int> left;
    vector<int> right;

    int half = toSort.size()/2;
    for(int i = 0; i < half; ++i)
    {
        left.push_back(toSort.at(i));
    }

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

    //merge algorithim

    vector<int> toReturn;
    while(left.size() > 0 || right.size() > 0)
    {
        cerr << "The numbers are "<< endl;
        if(left.size() > 0 && right.size() > 0)
        {
            if(left.at(0) <= right.at(0))
            {
                toReturn.push_back(left.at(0));
            }
            else
            {
                toReturn.push_back(right.at(0));
            }
        }
        else if(left.size() > 0)
        {
            toReturn.push_back(left.at(0));
        }
        else if(right.size() > 0)
        {
            toReturn.push_back(right.at(0));
        }
    }

    return toReturn;
}
向量向量操作::合并排序(向量到排序) { 如果(toSort.size()0 | | right.size()>0) { cerr(0) { if(左,在(0)0处) { toReturn.向后推_(在(0)处向左); } else if(right.size()>0) { 返回。向后推(右。在(0)处); } } 回归回归; } 在:


left
right
的大小永远不会改变(您不会删除head元素),因此
toreern
的大小会在没有绑定的情况下增长,并且内存会耗尽。

正如@BenJackson在回答中已经提到的那样

left
right
的大小永远不会改变。您只是从向量中获取元素,而不是从向量中移除。因此,
toReturn
的大小不受约束地增长

vector
没有任何方法来删除头部元素,但您可以实现类似的功能

left.erase(left.begin());
对于您的解决方案,要么从vector中删除head元素,要么只迭代vector并获取值

vector<int> toReturn;
int l = 0; r = 0;
while (l < left.size() || r < right.size()) {

    if (l < left.size() && r < right.size()) {
        if (left.at(l) <= right.at(r)) {
            toReturn.push_back(left.at(l++));
        } else {
            toReturn.push_back(right.at(r++));
        }
    } else if (l < left.size()) {
        toReturn.push_back(left.at(l++));
    } else if (r < right.size()) {
        toReturn.push_back(right.at(r++));
    }
}
vectoreturn;
int l=0;r=0;
而(l0){
cerr(0){
if(左,在(0)0处){
toReturn.向后推_(在(0)处向左);
//从左侧删除头部元素
left.erase(left.begin());
}else if(right.size()>0){
返回。向后推(右。在(0)处);
//从右侧删除头部元素
right.erase(right.begin());
}
}

我建议您开始使用调试器,因为
cerr
不允许您单步执行并查看变量。
vector<int> toReturn;
int l = 0; r = 0;
while (l < left.size() || r < right.size()) {

    if (l < left.size() && r < right.size()) {
        if (left.at(l) <= right.at(r)) {
            toReturn.push_back(left.at(l++));
        } else {
            toReturn.push_back(right.at(r++));
        }
    } else if (l < left.size()) {
        toReturn.push_back(left.at(l++));
    } else if (r < right.size()) {
        toReturn.push_back(right.at(r++));
    }
}
while (left.size() > 0 || right.size() > 0) {
    cerr << "The numbers are " << endl;
    if (left.size() > 0 && right.size() > 0) {
        if (left.at(0) <= right.at(0)) {
            toReturn.push_back(left.at(0));

            //erase head element from left
            left.erase(left.begin());

        } else {
            toReturn.push_back(right.at(0));

            //erase head element from right
            right.erase(right.begin());

        }
    } else if (left.size() > 0) {
        toReturn.push_back(left.at(0));

        //erase head element from left
        left.erase(left.begin());
    } else if (right.size() > 0) {
        toReturn.push_back(right.at(0));

        //erase head element from right
        right.erase(right.begin());
    }
}