首页 > 解决方案 > 双递归分段错误 C++

问题描述

我最近写了这个快速排序算法。编译后我得到一个“分段错误(核心转储)”。我对其进行了调试,结果发现第 25 行导致了问题: v2 = quicksort(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;
}

谢谢您的帮助。

标签: c++recursionsegmentation-faultquicksort

解决方案


首先,要使用 rand() 获得一个完全随机的数字,您需要为数字生成器播种。为此,您需要包含“time.h”库,然后编写:srand (time(NULL));

其次,您的快速排序有两个参数,一个名为 Vec 的向量和一个 int f,它们不用于任何操作。取函数参数的 int f 。

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

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

假设我们的 Vec 向量是 {2, 3}(这是实际值,因为我们没有为随机数生成提供种子)。

发生的情况是我们的枢轴 = 2,然后我们说如果 Vec[0](即 2)大于或等于枢轴,我们将 Vec[0] 添加到 v2,然后对 Vec [1],即 3。然后这个循环无限循环,因为你说v2 = quicksort(v2);. 这将使 Vec = v2。这意味着它永远不会变小,因为 Vec 是 {2, 3},因此我们的枢轴 = 2。


推荐阅读