女士们先生们,下午好。所以,这不是我犯错误的日子。在 C++ 中实现 Mergesort(不是就地),我在代码上遇到了真正的麻烦,不知道为什么。函数的倒数第二行将 的mergeSort()
结果分配给merge()
整数向量result
。这一行(实际分配,而不是函数)会引发bad_alloc
错误,我不知道为什么。
互联网表明这bad_alloc
主要是由于内存不足错误而引发的,但情况并非如此,因为它第一次被调用是在 500 个整数的向量上,这应该远不及太多内存(那是什么,比如2 Kb 在 32 位整数上?)。我假设我在为 C++ 做一些愚蠢和不正确的事情,但我不知道是什么。我尝试调用what()
异常,但这只是返回它的名称。编码:
vector<int> Sorting::mergeSort(vector<int> A) {
// If the length of A is 0 or 1, it is sorted.
if(A.size() < 2) return A;
// Find the mid-point of the list.
int midpoint = A.size() / 2;
// Declare the left/right vectors.
vector<int> left, right;
// Declare the return vector.
vector<int> result (A.size());
for(int i = 0; i < midpoint; ++i) {
left.push_back(A.at(i));
}
for(int i = midpoint; i < A.size(); ++i) {
right.push_back(A.at(i));
}
left = mergeSort(left);
right = mergeSort(right);
result = merge(left, right);
return result;
}
vector<int> merge(vector<int> left, vector<int> right) {
vector<int> result;
while(left.size() > 0 && right.size() > 0) {
if(left.front() <= right.front()) {
result.push_back(left.front());
left.erase(left.begin());
} else {
result.push_back(right.front());
right.erase(right.begin());
}
}
if(left.size() > 0) {
for(int i = 0; i < left.size(); ++i) {
result.push_back(left.at(i));
}
} else {
for(int i = 0; i < right.size(); ++i) {
result.push_back(right.at(i));
}
}
}
如果我重新编写merge
函数以仅在函数期间对其进行引用result
和编辑,它可以正常工作,但我想让代码尽可能接近为合并排序提供的“标准”伪代码。
我感谢任何帮助,谢谢。