当我尝试 size = 20000 时,代码可以正常工作,而当我尝试 size = 50000 时,代码似乎失败,给我以下错误:
2 [] cppapplication_4 7628 cygwin_exception :: open_stackdumpfile:将堆栈跟踪信息转储到cppapplication_4.exe.stackdump
long long compares; // for counting compares
long long swaps; // for counting swaps
bool counted_less(int n1, int n2) {
++compares;
return n1 < n2;
}
void counted_swap(int& n1, int& n2) {
++swaps;
int t = n1;
n1 = n2;
n2 = t;
}
int* partition(int* start, int* stop) {
int noUse=99;
int* pivot = (stop - 1); // you can randomly pick one as the pivot
int* i = start;
int* j = stop - 1;
for (;;) {
while (*i < *pivot && i < stop)
{
counted_less(noUse,noUse);
counted_less(noUse,noUse);
++i;
}
counted_less(noUse,noUse);
counted_less(noUse,noUse);
// skip "low" on left side
while (*j >= *pivot && j > start) {
counted_less(noUse,noUse);
counted_less(noUse,noUse);
--j;
}
counted_less(noUse,noUse);
counted_less(noUse,noUse);
// skip "high" on right side
if (i >= j)
{
counted_less(noUse,noUse);
break;
}
else
{
counted_less(noUse,noUse);
}
swap(*i, *j);
counted_swap(noUse,noUse);// swap out-of-place items
}
swap(*(stop - 1), *i);
counted_swap(noUse,noUse);// swap pivot to the final place i
return i;
}
void quickSort(int* start, int* stop) {
int noUse=99;
if (start>= stop){
counted_less(noUse,noUse);
return;
}
else
{
counted_less(noUse,noUse);
}
int* pivot = partition(start,stop);
quickSort(start, pivot);
quickSort((pivot +1), stop);
}
int main()
{
int size = 20000;
int* data = new int[size];
for (int i = 0; i < size; ++i) data[i] = i;
quickSort(data, data + size);
}
我认为该错误意味着我已经超出了数据类型的存储限制,我认为问题出在我使用int的问题上,所以我将所有int都更改为long long,但这仍然无法解决。而且根据代码的逻辑,我不认为我们正在更改数组的大小。所以我不确定是什么引起了错误。
答案 0 :(得分:1)
您可能正在堆栈溢出。这就是为什么递归不好的原因。
作为临时解决方法,请尝试通过与--stack 16777216
链接来增加堆栈大小:
$ g++ -Wl,--stack,16777216 . . .
==编辑==
另外,您选择在(end - 1)
处进行数据透视是不好的。尝试将枢轴设置在中间。
int* pivot = (stop - start)/sizeof(int*)/2 + start;