【发布时间】:2021-03-24 12:31:07
【问题描述】:
我已经阅读了很多帖子,但我不知道我的错误在哪里,所以我继续。
我的程序在cout<<endl 处抛出了段错误。当我擦除它时,程序甚至不打印任何东西。它只是打印段错误。显然程序永远不会对向量进行排序。
#include <iostream>
#include <vector>
using namesapce std
void inserctionSort(std::vector<double> &v, int i, int j)
{
double temp;
for(i; i < v.size(); i++)
{
temp = v[i];
j = i - 1;
while((v[j] > temp) && (j >= 0))
{
v[j+1] = v[j];
j--;
}
v[j+1] = temp;
}
}
void merge_(std::vector<double> &v, int i, int k, int j)
{
std::vector<double> w(v.size());
int n = j - i + 1;
int p = i;
int q = k + 1;
for(int l = 0; l < n; l++)
{
if(p <= k && (q > j || v[p] <= v[q]))
{
w[l] = v[p];
p++;
}else
{
w[l] = v[q];
q++;
}
}
for(int l = 0; l < n; l++)
v[i - 1 + l] = w[l];
}
void mergeSort(std::vector<double> &v, int i, int j)
{
int n = j - i + 1, n0 = 3;
int k;
if(n <= n0)
{
inserctionSort(v,i,j);
}else
{
k = i - 1 + n / 2;
mergeSort(v, i, k);
mergeSort(v, k + 1, j);
merge_(v, i, k, j);
}
}
int main()
{
vector<double> v1 = {3.2,4.1,55.42,2.24,5.424,667.32,35.54};
cout<<"Vector desordenado: ";
for(int i = 0; i < v1.size(); i++)
cout<<v1[i]<<", ";
cout<<"hola";
cout<<endl;
cout<<"hola";
mergeSort(v1, 0, v1.size()-1); //--> Core generado
//quickSort(v1, 0, v1.size()-1);
cout<<"Vector ordenado: ";
for(int i = 0; i < v1.size(); i++)
cout<<v1[i]<<", ";
return 0;
}
【问题讨论】:
-
j = i - 1; while((v[j]这在i == 0时表现出未定义的行为。 在你已经继续使用无效索引之后检查j >= 0有点毫无意义。 -
std::cout << std::endl;正在将输出刷新到您的屏幕。由于在这和你的崩溃之间没有任何刷新,那么这就是你所看到的。使用调试器单步调试代码,而不是依赖输出。 -
j = i - 1; while((v[j]这并不能解决我的问题,因为使用快速排序算法它可以毫无问题地运行。所以我认为问题不在于插入排序。 @IgorTandetnik
标签: c++ vector segmentation-fault mergesort coredump