我正在努力思考C ++中的mergesort的以下递归实现
我得到的是,因为向量是通过引用传递的,并且正在调用vec.clear(),所以即使在完成某些合并之后,这也不会消除向量。例如,当命中基数时,该函数返回堆栈上的顶部框架并继续沿堆栈向下移动。但是,函数需要多次合并,并且在每次合并之前清除向量,我认为这意味着内存中的空间(因为它是通过引用传递)被清除掉,我们失去了已经合并的内容?我可以理解这个方法如果按值传递会如何工作,但这是通过引用传递的,所以我很困惑。
void merge(vector<int> &final, vector<int> &left, vector<int> &right) {
while (left.size() > 0 || right.size() > 0) {
if (right.size() == 0) {
final.push_back(left.at(0));
left.erase(remove(left.begin(), left.end(), left.at(0)), left.end());
}
else if (left.size() == 0) {
final.push_back(right.at(0));
right.erase(remove(right.begin(), right.end(), right.at(0)), right.end());
} else if (left.at(0) <= right.at(0)) {
final.push_back(left.at(0));
left.erase(remove(left.begin(), left.end(), left.at(0)), left.end());
} else if (right.at(0) < left.at(0)) {
final.push_back(right.at(0));
right.erase(remove(right.begin(), right.end(), right.at(0)), right.end());
}
}
}
void sort(vector<int> &vec) {
int n = vec.size();
// BASE CASE
if (n <= 1) {
return;
}
// GENERAL CASE / RECURSIVE CASE
vector<int> leftVec;
vector<int> rightVec;
for (int i = 0; i < n; i++) {
if (i < n / 2) {
leftVec.push_back(vec.at(i));
} else {
rightVec.push_back(vec.at(i));
}
}
sort(leftVec);
sort(rightVec);
vec.clear();
merge(vec, leftVec, rightVec);
}
答案 0 :(得分:2)
在vec
来电之前,leftVec
的内容已被复制到rightVec
和clear
,因此没有丢失任何信息。您尚未获得merge
的来源,但我们可以假设它将内容复制回vec
。