mergesort中的合并函数,“向量下标超出范围”

时间:2013-02-01 00:50:19

标签: c++ mergesort

这是我的mergesort函数,我无法理解为什么我总是得到一个"向量下标超出范围" VC ++ express 2010中的错误。

vector<int> Ordinatore::doMerge(vector<int> &v1, vector<int> &v2) {
int dimV1 = v1.size();
int dimV2 = v2.size();

int dimTotale = dimV1 + dimV2;
vector<int> merged; 

int lh, rh;
lh=0;rh=0;


while(lh < dimV1)  {


    if (rh < dimV2 && v1[lh] <= v2[rh]) {

        merged.push_back(v1[lh]);

        lh++;
        /* the trouble should start here as far as I've seen with cout & debugging */
        while (rh < dimV2  && v2[rh] <= v1[lh]) {

            merged.push_back(v2[rh]);

            rh++;

        }

    }
    else {

        while (rh < dimV2  && v2[rh] <= v1[lh]) {
            merged.push_back(v2[rh]);
            rh++;
        }
        merged.push_back(v1[lh]);

        lh++;

    }
}

return merged;
}

1 个答案:

答案 0 :(得分:0)

问题出现在你的循环中:

while(lh < dimV1)  {
    if (rh < dimV2 && v1[lh] <= v2[rh]) {
        merged.push_back(v1[lh]);
        lh++;                                       // |<-- Problem
        while (rh < dimV2  && v2[rh] <= v1[lh]) {   // |
           ...
        }
    }
    else {
        ...
        lh++;
    }
}

执行lh++中的else时,lh会递增,while(lh < dimV1)会重新启动。让我们假设它一直到lh == dimV1 - 1 ...

  • 如果if条件评估为true,则lh++执行正确,如果您已标记“麻烦应从此处​​开始”。
  • 下一行while (rh < dimV2 && v2[rh] <= v1[lh])会导致崩溃,因为lh现在等于dimV1,但您使用它来索引v1

您可以在此Wikipedia Article中详细了解合并排序。