在C ++中使用Mergesort实现出错

时间:2015-12-12 11:17:27

标签: c++ algorithm mergesort

我正在学习实现一个mergesort算法用于计算反转。这是我目前的mergesort实现。但是它不起作用,因为它不返回已排序的数组。有人能告诉我在我编写的这段代码中错误地做了什么吗?它应该对输入到函数中的数组v进行排序。

void mergeCountInversion(vector<int> v, int l, int r)
{
    if (l >= r)
    {
        return;
    }

    int m = (l + r)/2;  

    //call merge sort to return two sorted arrays
    mergeCountInversion(v, l, m);
    mergeCountInversion(v, m+1, r);

    int left = l;
    int right = m+1;
    std::vector<int> vtemp ;

    //merge and sort the two sorted array, storing the sorted array in vtemp
    for (int k = l; k <= r; ++k){
        if (left >= m+1)
        {
            vtemp.push_back(v[right]);
            right++;
        }
        else if (right > r)
        {
            vtemp.push_back(v[left]);
            left++;
        }
        else
        {
            if (v[left] <= v[right])
            {
                vtemp.push_back(v[left]);
                left++;
            }
            else{
                vtemp.push_back(v[right]);
                right++;
                count += m + 1 - left;
            }
        }
    }

    //replace v with the sorted array vtemp
    for (int i = 0; i < vtemp.size(); ++i)
    {
        v[l+i] = vtemp[i];
    }
}

2 个答案:

答案 0 :(得分:1)

您已定义

void mergeCountInversion(vector<int> v, int l, int r)

然后你首先递归调用mergeCountInversion,并在调用返回后修改v

问题是,永远不会看到递归调用中对v所做的更改,因为v 按值传递

尝试通过引用传递v

void mergeCountInversion(vector<int>& v, int l, int r)

这样所有调用都在v的同一副本上工作。

答案 1 :(得分:1)

您的代码中存在多个问题。

您正在按值传递矢量,但您应该通过引用传递它。

如果您将该功能声明为void,则不能return 0;,只需return;

创建vtemp时,您应该确切知道它的大小:r - l。所以你可以为它保留记忆,而你不需要推回。

您也必须将计数传递给该函数。

您的功能可以是:

void mergeCountInversion(vector<int> & v, int l, int r, int & count) {
    if (l >= r) return;

    int m = (l + r)/2;  

    //call merge sort to return two sorted arrays
    mergeCountInversion(v, l, m, count);
    mergeCountInversion(v, m+1, r, count);

    int left = l;
    int right = m+1;
    std::vector<int> vtemp(r-l);

    //merge and sort the two sorted array, storing the sorted array in vtemp
    for (int k = l; k <= r; ++k) {
        if (left >= m+1) {
            vtemp[k] = v[right];
            right++;
        }
        else if (right > r) {
            vtemp[k] =  v[left];
            left++;
        }
        else {
            if (v[left] <= v[right]) {
                vtemp[k] = v[left];
                left++;
            }
            else {
                vtemp[k] = v[right];
                right++;
                count += m + 1 - left;
            }
       }
    }

    //replace v with the sorted array vtemp
    for (int i = 0; i < vtemp.size(); ++i)
    v[l+i] = vtemp[i];
}