首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现归并排序算法问题

实现归并排序算法问题
EN

Stack Overflow用户
提问于 2014-01-07 05:30:17
回答 2查看 90关注 0票数 1

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

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

发布于 2014-01-07 05:34:21

在:

代码语言:javascript
复制
while(left.size() > 0 || right.size() > 0)

leftright的大小永远不会改变(您不会删除head元素),因此toReturn不受限制地增长,您会耗尽内存。

票数 1
EN

Stack Overflow用户

发布于 2018-01-24 14:40:00

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

leftright的大小永远不会改变。您只需从向量中获取元素,而不是将其删除。因此,toReturn的大小无限制地增长。

vector没有任何方法来移除head元素,但您可以实现类似于

代码语言:javascript
复制
left.erase(left.begin());

对于您的解决方案,您可以从向量中删除head元素,或者只迭代向量并获取值。

代码语言:javascript
复制
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++));
    }
}

通过擦除head元素合并实现。

代码语言:javascript
复制
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());
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20959627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档