c++ - 双递归分段错误 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;
}
谢谢您的帮助。
解决方案
首先,要使用 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。
推荐阅读
- r - 一张图片中的小提琴情节
- javascript - 尽管返回值,AWS Lambda 仍会重试
- java - 在java中读取写入Excel文件
- r - 如何优化(最大化)R中的函数
- libktx - 并行运行while循环
- vue.js - Vue.js 如何管理 nuxt keep-alive 键?
- c++ - 如何为一组集合定义比较函数?
- reactjs - Framer Motion 和 React 路由器 5:如何防止使用嵌套路由重新渲染父组件?
- php - Laravel Passport 使用 Axios 401 使用自己的 API 未经身份验证
- django - Docker-compose 与 Django、Redis、Gunicorn、Uvicorn、Nginx:我的 Nginx 工作正常吗?