C++ 双递归分段错误c++;
我最近写了这个快速排序算法。编译后,我得到一个“分段错误(内核转储)”。我调试了它,结果是第25行导致了问题: v2=快速排序(v2); 然而,我不知道为什么我得到一个“核心倾倒”,因为我不知道这条线有什么问题。 这是我的密码: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
#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;i cout首先,要使用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;
}