合并排序c异常OOR UPD ::输出问题

时间:2013-01-31 13:22:59

标签: c++ recursion output mergesort

在尝试使用递归调用进行此合并排序算法时,我最终获得了std :: out_of_range的异常。

我对调试和查找错误原因知之甚少。下面我将发布代码(不完整,只有一些部分)和包含相同代码的源文件(当然是完整版)。

我很乐意听取建议,即使他们没有提供任何帮助来解决这个错误,所以请随意评论这段代码并开玩笑吧:)

https://docs.google.com/file/d/0ByVN9ccAyFY2dkVLN0ZlTWVHZG8/edit

主要功能

int main()
{
vector<int> original;   //input vector
input (&original);      //write input to vector<int> original

divide(&original);      //pass the vector

for(unsigned int i=0;i<original.size();i++)//output the results
cout<<original.at(i);
}

输入功能

    int input(vector<int> *inVec) //read all input until non-integer
{
int tmp;
while (cin>>tmp)
inVec->push_back(tmp);
for(unsigned int i=0;i<inVec->size();i++)
cout<<inVec->at(i)<<endl;
}

鸿沟

int divide(vector<int> *original)
{
int origL=original->size();
if(origL>1)
{
vector<int> first;      //vectors for holding 2 halfs of "original"
vector<int> second;     //

first.assign(original->begin(),original->begin()+origL/2);//1st half of "original"
second.assign(original->begin()+origL/2+1,original->end());//2nd half

divide(&first);     //recursive call until "first" and
divide(&second);    //"second" include only one number

merge(&first,&second,original);//merge first and second back into one vector
}
}

合并func

int merge(vector<int> *A,vector<int> *B,vector<int> *original)
{
//clear the original vector. we will use it to store sorted results.
original->erase(original->begin(),original->end());
unsigned int i=0,j=0;                                   

//out the smallest number from A and B into
//original[0] and so on. This makes it a 
//sorting algorithm.
for(i=0;i<A->size();i++)
{
if(j<B->size())
    if(A->at(i)<=B->at(j))
        original->push_back(A->at(i));
    else{
        original->push_back(B->at(j));
        i--;j++;}
}
//the ABOVE loop scans whole vector A or B.
//if there are still uncopied elements in
//the other vector, then we check for them and
//push them into original.
if(j<B->size())
    for(i=j;i<B->size();i++)
        original->push_back(B->at(i));
if(i<A->size())
    for(j=i;j<A->size();j++)
        original->push_back(A->at(j));


return EXIT_SUCCESS;
}

EDIT1: 对MERGE进行了更改,因此现在没有运行时错误。但是,输出不对。如果有人注意到可能导致问题的原因,请告诉我。与此同时,我将尝试自己找到它。

3 个答案:

答案 0 :(得分:1)

当您在B函数merge中耗尽元素时会发生什么? OOR。当B中的所有元素都小于A中的元素并且只调用merge来查看我的意思时,请尝试测试用例。

这也是c ++,请优先使用引用。

答案 1 :(得分:0)

merge 函数中存在错误,您应该测试向量 B 或向量 A 是否为空,或者访问向量将导致异常。

答案 2 :(得分:0)

下一部分不正确:

first.assign(original->begin(),original->begin()+origL/2);
second.assign(original->begin()+origL/2+1,original->end());

F.e。当你有origL == 2时,第一个向量将是{original [0]},第二个向量将是空的。您必须为第二个向量重新实现填充:

second.assign(original->begin()+origL/2,original->end())