下午好女人和男人。所以,這不是我犯錯的日子。在C++中實現Mergesort(不是就地),我在代碼中遇到了麻煩,不知道爲什麼。 mergeSort()
函數的倒數第二行將merge()
的結果分配給一個整數,result
向量。這行(實際分配,而不是函數)拋出一個bad_alloc
錯誤,我不知道爲什麼。Mergesort - std :: bad_alloc當試圖分配矢量時拋出
互聯網暗示bad_alloc
大多是由於內存不足造成的錯誤,但這不可能是這種情況,因爲它第一次被調用的矢量是500個整數,而這個矢量應該沒有太多內存(那是什麼,就像32位int中的2 Kb?)。我假設我正在爲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
和功能時編輯它,它工作正常,但我想保持代碼儘可能接近的「標準'僞碼給合併排序。
我感謝任何幫助,謝謝。
我明白你爲什麼不想使用引用,但我認爲你應該重新考慮這一點。爲了使代碼更好更快,而不是傳遞向量,爲什麼不僅僅使用索引?所以遞歸調用只會得到開始和結束索引以及對正在排序的向量的引用。 – PeterK 2010-08-15 16:43:25
因爲這是一個in-place合併排序,並且稍後會被編碼。我正在爲自己編寫一個排序算法庫。爲了娛樂。是的,我需要幫助。 – Stephen 2010-08-15 16:45:08
有趣的編碼東西是:) – PeterK 2010-08-15 16:48:23