我正在尝试用C ++中的this page编写第一个算法。这是我在使用这种语言时得到的结果:
void quicksort (vector<int>& numbers) {
int leftSize = numbers.size() / 3
, rightSize = numbers.size() - leftSize;
vector<int>::iterator pivot = numbers.end() - rightSize; //Choose one third of the way through as the pivot.
vector<int> left;
vector<int> right;
if(numbers.size() <= 1) {
return;
}
//Place numbers less than the pivot on the left side and numbers greater on the right side
for(vector<int>::iterator x = numbers.begin(); x < numbers.end(); x++) {
if(*x < *pivot) {
left.push_back(*x);
} else {
right.push_back(*x);
}
}
quicksort(left);
quicksort(right);
//Concatenate the arrays
numbers.clear();
numbers.insert(numbers.end(), left.begin(), left.end());
numbers.insert(numbers.end(), right.begin(), right.end());
}
但这是错误Segmentation fault (core dumped)
。我只是在大小为20的向量上测试它,所以它不应该是我的内存不足。我能够发现的是,quicksort(right)
的调用引起了问题。仅注释该行并离开quicksort(left)
不会产生运行时错误(尽管向量显然不会排序)。
为什么quicksort(left)
可行,但不是quicksort(right)
?
答案 0 :(得分:3)
如果选择向量的最小元素作为数据透视表,则所有元素(包括数据透视图)都将进入right
。然后,您在quicksort
上调用right
,这是您之前使用的向量。每次调用quicksort
都会对quicksort
进行相同的调用,您很快就会超过堆栈的最大深度并获得段错误。