【问题标题】:c++ merge sort won't merge?c ++合并排序不会合并?
【发布时间】:2012-04-10 01:03:57
【问题描述】:

我正在尝试使这个mergesort函数对向量或单词节点进行排序(包含单词长度,出现次数和单词本身)似乎进入了一次合并函数,然后程序失败,有什么想法吗?

bool Utility::mergeSort_occurences(vector<Word> &invector){
    if (invector.size() <= 1){
        return true;
    }
    vector<Word> left, right;
    int middle = (invector.size()/2);
    for(int i = 0 ; i < middle ; i++){
        left.push_back(invector[i]);
    }
    for(int i = middle ; i < invector.size() ; i++){
        right.push_back(invector[i]);
    }
    mergeSort_occurences(left);
    mergeSort_occurences(right);
    invector = mergeOccurences(left, right);
    return true;
}

vector<Word> Utility::mergeOccurences(vector<Word> &left, vector<Word> &right){
    vector<Word> mergelist;
    while(left.size() > 0 || right.size() > 0){
        if(left.size() > 0 && right.size() > 0){
            if(left[0].getOccurences() <= right[0].getOccurences()){
                mergelist.push_back(left[0]);
                left.erase(left.begin());
            }else{
                mergelist.push_back(right[0]);
                right.erase(right.erase(right.begin()));
            }
        }
        else if(left.size() > 0){
           mergelist.push_back(left[0]);
           left.erase(left.begin()); 
        }
        else if(right.size() > 0){
           mergelist.push_back(right[0]);
           right.erase(right.erase(right.begin()));            
        }
    }
    return mergelist;
}

【问题讨论】:

  • 是的 - 你可以调试它。使用向量中的一个很小的数据集,通过调试器运行代码。四个值,说。然后,找出问题所在应该相当容易,比通过盯着别人编写的一页复杂的向量/数组处理代码来试图发现问题要容易得多。

标签: c++ sorting vector mergesort


【解决方案1】:

您的right.erase(right.erase(right.begin())); 代码看起来很狡猾。 erase 函数返回一个迭代器,指向被删除元素的后继元素,如果你删除了最后一个元素,它就是 end()

您使用right.size() &gt; 0 保护此代码,这仅保证有一项。您有两个擦除操作。

您是否调查过在right.end() 上执行erase 的后果?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多