繁体   English   中英

理解MergeSort C ++的递归实现的一部分

[英]Understanding Part of Recursive Implementation of MergeSort C++

我正在努力思考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);
}

clear调用之前, vec的内容已复制到leftVecrightVec ,因此没有信息丢失。 您尚未给出merge源,但我们可以假设它将内容复制回vec

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM