C ++:Mergesort问题:超出范围?

时间:2014-04-05 06:15:02

标签: c++ pass-by-reference mergesort

(C ++) 大家好,这是我第一次尝试mergesort。我看到我的代码类似于发布过早期问题的人:here。 在较低级别,排序按预期工作。但是,我认为我的问题是排序数组在每个较低级别之后超出范围,因此从未正确排序。 在那种情况下,我尝试使用“std :: vector&”通过引用传递。我错了吗?通过引用传递的正确方法是什么?

以下是我的代码:

/*
MERGE SORT
breaking down the sorting into pairs concursively until we are comparing only two values
The two integers parameters denotes indices for beginning and ending values in vector
Merge sort inclusive of both left and right range
*/
#include <vector> // for using vectors in c++
void merge(std::vector<int>& inputv, int beg_i, int end_i)
{
    int d = beg_i;  // used as an index
    int e = beg_i + (end_i - beg_i)/2 + 1;  // used as an index

    int y = beg_i + (end_i - beg_i)/2;     // used as a check against d
    int z = end_i;  // used as a check against e

    std::vector<int> tempvect(inputv.size());

    for (int c = beg_i; c < z+1; c++)
    {
        if (e > z && d > y)
        {
            // do nothing
        }
        else if (e > z)
        {
            tempvect[c] = inputv[d];
            d++;
        }
        else if (d > y)
        {
            tempvect[c] = inputv[e];
            e++;
        }

        else if(inputv[d] > inputv[e])
        {
            tempvect[c] = inputv[e];
            e++;
        }
        else if(inputv[d] <= inputv[e])
        {
            tempvect[c] = inputv[d];
            d++;
        }
    }
    for (int i = beg_i; i < end_i+1; i++)
    {
        inputv[i] = tempvect[i];
    }
}

void mergesort(std::vector<int> inputvector, int beg_i, int end_i)
{
    if(end_i - beg_i == 0) 
    {
        // do nothing
    }
    if(end_i - beg_i >= 1)
    {
        int mid_i = beg_i + (end_i - beg_i)/2;

        mergesort(inputvector,beg_i,mid_i); // reclusive to last card
        mergesort(inputvector,mid_i+1,end_i);   // resulsive to last card
        merge(inputvector,beg_i,end_i); // actual implementation to sort and merge the vectors
    }

}

2 个答案:

答案 0 :(得分:2)

如果您想模仿在突出显示的主题中看到的代码,请注意代码使用指针。使用指针的函数基本上改变了指针指向的内容。

因此,您应该这样做来模拟此行为:

void mergesort(std::vector<int>& inputvector, int beg_i, int end_i)

您必须通过引用传递矢量。您没有看到结果的原因是传递值会创建一个本地临时副本,当函数返回时,临时值会消失。您不希望这样 - 您希望将结果定向到您传入的矢量,而不是临时副本,因此通过引用传递矢量。

答案 1 :(得分:1)

无论如何,我意识到它仍然超出范围的原因是我做了这个:

void merge(std::vector<int>& inputv, int beg_i, int end_i)

我没有这样做:

void mergesort(std::vector<int>& inputvector, int beg_i, int end_i)

感谢PaulMcKenzie的快速回复,这指出了我愚蠢的愚蠢行为。