簡體   English   中英

C ++:Mergesort問題:超出范圍?

[英]C++: Mergesort Issue: going out of scope?

(C ++)大家好,這是我第一次嘗試進行mergesort。 我看到的代碼類似於發布了先前問題的人: 此處 在較低級別,排序按預期進行。 但是,我相信我的問題是排序的數組在每個較低級別之后都超出范圍,因此永遠不會正確排序。 在這種情況下,我嘗試使用“ 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
    }

}

如果要模仿在突出顯示的線程中看到的代碼,請注意該代碼使用指針。 使用指針的函數基本上是在更改指針所指向的內容。

因此,您應該這樣做以模擬此行為:

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

您必須通過參考傳遞矢量。 之所以看不到結果,是因為按值傳遞會創建本地臨時副本,並且當函數返回時,該臨時副本就會消失。 您不需要這樣做-您希望將結果定向到要傳遞的向量,而不是臨時副本,因此請按引用傳遞向量。

無論如何,我意識到它仍然超出范圍的原因是盡管我這樣做:

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的及時答復,指出了我愚蠢的愚蠢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM