分割矢量

时间:2017-09-14 19:34:34

标签: c++

我试图将MergeSort作为家庭作业来实施。我得到了一个名为MergeSort的函数,它接受一个输入向量。然后,我获得了拆分和合并功能。

我知道MergeSort是如何工作的,我已经多次使用Java实现了,但我一直使用数组,而且我对指针和引用没有多少经验。

这是我到目前为止所拥有的,

void Split(const std::vector<int>& input, std::vector<int>* output1, std::vector<int>* output2) {



    std::cout << "In split function" << std::endl;
    // this just prints the values in my vector
    for (int i = 0; i < input.size(); i++) {
        std::cout << input[i] << ", ";
    }
    std::cout << std::endl;

    if (input.size() > 1) {


        int i = 0;
        int j = input.size();

        while (i <= j) {
            output1->push_back(input[i]);
            i++;


            if (i != j) {
                output2->push_back(input[j]);
                j--;
            }
        }



        std::vector<int> left= {};
        std::vector<int> right = {};

        Split(*output1, &left, &right);
        Split(*output2, &left, &right);
    }
}

void MergeSort(std::vector<int>* input){
    std::vector<int> output1= {};
    std::vector<int> output2 = {};
    std::cout << "Starting mergesort" << std::endl;
    Split(*input, &output1, &output2);

}

我还有一个合并功能,我不想包含它,因为它与我的问题无关。

现在,我的代码编译但是它陷入无限循环并且给我一个段错误。

我有一个main函数,它使用值{3,5,1,2,9,4}调用MergeSort函数

调用Split函数,然后将其打印到stdout直到终止:

In split function 3, 5, 1,

为什么我会陷入这个循环?

1 个答案:

答案 0 :(得分:2)

正如评论所指出的那样,这个数组的索引是错误的。

int i = 0;
int j = input.size();

因此,您的循环最终生成output1{3, 5, 1},然后将其输入Split(...),再次生成{3, 5, 1},直到递归导致一段错误。

int i = 0;
int j = input.size() - 1; 

这会导致output1数组实际缩小{3, 5},导致if(input.size() > 1)

的基本情况终止