C++ 双递归分段错误c++;

C++ 双递归分段错误c++;,c++,recursion,segmentation-fault,quicksort,C++,Recursion,Segmentation Fault,Quicksort,我最近写了这个快速排序算法。编译后,我得到一个“分段错误(内核转储)”。我调试了它,结果是第25行导致了问题: v2=快速排序(v2); 然而,我不知道为什么我得到一个“核心倾倒”,因为我不知道这条线有什么问题。 这是我的密码: #include <iostream> #include <vector> #include <random> using namespace std; vector <float> quicksort(vector

我最近写了这个快速排序算法。编译后,我得到一个“分段错误(内核转储)”。我调试了它,结果是第25行导致了问题: v2=快速排序(v2); 然而,我不知道为什么我得到一个“核心倾倒”,因为我不知道这条线有什么问题。 这是我的密码:

#include <iostream>
#include <vector>
#include <random>

using namespace std;

vector <float> quicksort(vector <float> Vec)
{
    if(Vec.size() > 1)
    {
        float pivot = Vec[(Vec.size())/2-1];

        vector <float> v1, v2;
        vector <float> V;

        for(unsigned int i = 0; i < Vec.size(); i++)
        {
            if(Vec[i] >= pivot)
                v2.push_back(Vec[i]);
            else
                v1.push_back(Vec[i]);
        }

        v1 = quicksort(v1);
        v2 = quicksort(v2);
        //after debuggung, I found out that the line above causes the "segmentation fault (core dumped)" (line 25)

        for(unsigned int i = 0; i < v1.size(); i++)
            V.push_back(v1[i]);
        for(unsigned int i = 0; i < v2.size(); i++)
            V.push_back(v2[i]);

        return V;
    }
    else
    {
        return Vec;
    }

}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    vector <float> v;

    for(int i = 0; i < 100; i++)
    {
        v.push_back(rand() % 100);
        cout << v[i] << " ";
    }

    v = quicksort(v);

    for(int i = 0; i < 100; i++)
    {
        cout << v[i] << " ";
    }

    return 0;
}
#包括
#包括
#包括
使用名称空间std;
向量快速排序(向量向量向量)
{
如果(向量大小()>1)
{
浮动轴=向量[(向量大小())/2-1];
向量v1,v2;
向量V;
for(无符号整数i=0;i=pivot)
v2.推回(Vec[i]);
其他的
v1.推回(Vec[i]);
}
v1=快速排序(v1);
v2=快速排序(v2);
//调试之后,我发现上面这行代码导致了“分段错误(堆芯转储)”(第25行)
for(无符号整数i=0;icout首先,要使用rand()获得一个完全随机的数字,您需要为数字生成器设置种子。为此,您需要包含“time.h”库,然后写入:
srand(time(NULL));

其次,您的快速排序需要两个参数,一个名为Vec的向量和一个不用于任何用途的int f

第三,问题是在代码的这一部分(第17到23行)发生了无限循环:

for(无符号整数i=0;i=pivot)
v2.推回(Vec[i]);
其他的
v1.推回(Vec[i]);
}
假设我们的Vec向量是{2,3}(这是实际值,因为我们没有生成随机数)

现在的情况是我们的轴=2,然后我们说如果向量[0]大于或等于轴,我们把向量[0]加到v2,然后把向量[1]加到3。
然后它无限循环,因为你说
v2=quicksort(v2);
,这将使Vec=v2。这意味着它永远不会变小,因为,同样,Vec是{2,3},因此我们的pivot=2。

它进入堆栈溢出

如果轴是向量向量向量的最大数量,则必须将其从Vinf拖动到Vsup

#include <iostream>
#include <vector>
#include <random>

using namespace std;

vector <float> quicksort(vector <float> Vec) {        //the int f was never used un the function
    if (Vec.size() > 1){
        vector <float> Vinf, Vsup, Vtmp;
        Vinf.push_back(Vec[(Vec.size()) / 2 - 1]);
        float pivot = Vinf[0];
        Vec.erase(Vec.begin() + Vec.size() / 2 - 1);
        for (unsigned int i = 0; i < Vec.size(); i++)
            Vec[i] > pivot ? Vsup.push_back(Vec[i]) : Vinf.push_back(Vec[i]);
        if (Vinf.size() == Vec.size() + 1) {
            Vsup.push_back(pivot);
            Vinf.erase(Vinf.begin());
        }
        Vinf = quicksort(Vinf);
        Vsup = quicksort(Vsup);
        for (unsigned int i = 0; i < Vinf.size(); Vtmp.push_back(Vinf[i++]));
        for (unsigned int i = 0; i < Vsup.size(); Vtmp.push_back(Vsup[i++]));
        return Vtmp;
    }
    else
        return Vec;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    vector <float> v;
    for (int i = 0; i < 100; cout << v[i++] << " ")
        v.push_back(rand() % 100);
    cout << endl;
    v = quicksort(v);
    for (int i = 0; i < v.size(); cout << v[i++] << " ");
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
向量快速排序(vector Vec){//函数中从未使用int f
如果(向量大小()>1){
向量Vinf、Vsup、Vtmp;
向后推(向量[(向量大小())/2-1]);
浮动轴=Vinf[0];
向量擦除(向量开始()+向量大小()/2-1);
for(无符号整数i=0;ipivot?Vsup.push_back(Vec[i]):Vinf.push_back(Vec[i]);
如果(VIN.size()==向量大小()+1){
向后推(枢轴);
擦除(Vinf.begin());
}
Vinf=快速排序(Vinf);
Vsup=快速排序(Vsup);
for(unsigned int i=0;i对于(int i=0;i<100;cout)这是如何编译的?您的快速排序接受一个向量和一个int,但您只给它一个向量…我认为实际问题不在这段代码中。在您的实际案例中,向量中还有其他内容吗?非常感谢!第二个参数不在原始代码中(我不知道为什么会出现在这里)谢谢你给我的随机数提示,我以后会注意到的。现在我看到你是正确的,这确实是一个无限循环。我帮助了LoBTW,在C++中不要使用<代码> RAND()。
#include <iostream>
#include <vector>
#include <random>

using namespace std;

vector <float> quicksort(vector <float> Vec) {        //the int f was never used un the function
    if (Vec.size() > 1){
        vector <float> Vinf, Vsup, Vtmp;
        Vinf.push_back(Vec[(Vec.size()) / 2 - 1]);
        float pivot = Vinf[0];
        Vec.erase(Vec.begin() + Vec.size() / 2 - 1);
        for (unsigned int i = 0; i < Vec.size(); i++)
            Vec[i] > pivot ? Vsup.push_back(Vec[i]) : Vinf.push_back(Vec[i]);
        if (Vinf.size() == Vec.size() + 1) {
            Vsup.push_back(pivot);
            Vinf.erase(Vinf.begin());
        }
        Vinf = quicksort(Vinf);
        Vsup = quicksort(Vsup);
        for (unsigned int i = 0; i < Vinf.size(); Vtmp.push_back(Vinf[i++]));
        for (unsigned int i = 0; i < Vsup.size(); Vtmp.push_back(Vsup[i++]));
        return Vtmp;
    }
    else
        return Vec;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    vector <float> v;
    for (int i = 0; i < 100; cout << v[i++] << " ")
        v.push_back(rand() % 100);
    cout << endl;
    v = quicksort(v);
    for (int i = 0; i < v.size(); cout << v[i++] << " ");
    return 0;
}