Segfault在排序矢量时

时间:2012-12-28 17:40:43

标签: c++ segmentation-fault

作为练习,我在模板中实现了快速排序算法,并且对于具有少量元素(最多约760)的向量“工作正常”,但是为更多数量的元素提供了seqfault。有人能告诉我我做错了什么:

template< typename Vector, typename VecElem > void qsort(Vector *pv)
{
    if (pv->size()<=1) return;

    VecElem p;
    Vector *pvl=new Vector,*pvr=new Vector;

    p = pv->back();
    pv->pop_back();
    pvr->push_back(p);
    for (auto it=pv->begin();it!=pv->end();it++)
    {
        if (*it < p) pvl->push_back(*it);
        else pvr->push_back(*it);
    }
    qsort<Vector,VecElem>(pvl);
    qsort<Vector,VecElem>(pvr);
    if (pvl->size()) *pv = *pvl;
    if (pvr->size()) std::copy(pvr->begin(), pvr->end(), std::back_inserter(*pv));
    delete pvl;
    delete pvr;
}

1 个答案:

答案 0 :(得分:4)

正如其他人所指出的,例如,你的实施效率不高。排序升序数据。但是,这不是您的段错误的原因。您的代码中的问题是您在分区阶段不排除pivot元素。

只需尝试对仅包含两个相同元素(例如{0,0})的矢量进行排序。它将无限循环。

要解决此问题,请在对两个向量进行排序后插入pivot元素。

也许这有效(至少可以解决堆栈溢出问题):

pvr->push_back(p); // remove this line

// and insert it later...
qsort<Vector,VecElem>(pvl);
qsort<Vector,VecElem>(pvr);
pvl->push_back(p); // this line is new