C++ C++;合并排序获取垃圾元素

C++ C++;合并排序获取垃圾元素,c++,mergesort,array-merge,C++,Mergesort,Array Merge,我们的讲师让我们先创建自己的合并排序算法,然后再向我们展示如何创建一个。他解释了它是如何工作的,这就是我想到的。它可以工作,但有一个bug,我的代码捕捉到了垃圾号。第一个垃圾数出现在向量/数组大小为7时,然后是11,依此类推。 此代码的输出为: Size of Vec1: 7 Size of Vec2: 8 1 3 4 5 6 15 16 0 #包括 #包括 std::vector merge(std::vector left,std::vector right); 标准::向量合并排序(标准

我们的讲师让我们先创建自己的合并排序算法,然后再向我们展示如何创建一个。他解释了它是如何工作的,这就是我想到的。它可以工作,但有一个bug,我的代码捕捉到了垃圾号。第一个垃圾数出现在向量/数组大小为7时,然后是11,依此类推。 此代码的输出为:

Size of Vec1: 7
Size of Vec2: 8
1 3 4 5 6 15 16 0
#包括
#包括
std::vector merge(std::vector left,std::vector right);
标准::向量合并排序(标准::向量和向量){
如果(vec.size()=right.size()){
//在未添加左侧的所有元素时,添加每个元素
while(leftCurrent+1=left.size()){
//虽然未添加右侧的所有元素,但请添加每个元素
while(rightCurrent+1
//右侧未满时

while(rightCurrent+1)在合并算法中掩埋while循环不是一个好主意。只是说。你只需要一个级别。奇数长度vs not的逻辑也有点毫无意义。天哪!谢谢!!
#include <iostream>
#include <vector>

std::vector<int> merge(std::vector<int> left, std::vector<int> right);

std::vector<int> mergeSort(std::vector<int> &vec){

    if(vec.size() <= 1){
    return vec;
    }
    
    int halfsize = vec.size() / 2;
    
    std::vector<int> left (vec.begin(), vec.begin() + halfsize);
    std::vector<int> right(vec.begin() + halfsize, vec.end());
    return merge(mergeSort(left), mergeSort(right));

}

std::vector<int> merge(std::vector<int> left, std::vector<int> right){

    std::vector<int> newVector;
    size_t leftCurrent = 0;
    size_t rightCurrent = 0;
    
    //while not all element in the vector is added
    while(newVector.size() < right.size() + left.size()){

        //compare left and right current number
        if(right[rightCurrent] < left[leftCurrent]){
            newVector.push_back(right[rightCurrent]);
            rightCurrent++;

            //if all element in right is added
            if(rightCurrent >= right.size()){
                //while all element in left is not added, add each element
                while(leftCurrent + 1 <= left.size()){
                    newVector.push_back(left[leftCurrent]);
                    leftCurrent++;
                }
                return newVector;
            }
        }
        else{
            newVector.push_back(left[leftCurrent]);
            leftCurrent++;

            //if all element in left is added
            if(leftCurrent >= left.size()){
                //while all element in right is not added, add each element
                while(rightCurrent + 1 <= left.size()){
                    newVector.push_back(right[rightCurrent]);
                    rightCurrent++;
                }
                return newVector;
            }
        }
    }
    
    return newVector;
}

int main(){
    
    std::vector<int> vec1 {6,5,3,1,8,7,2,4,9,10,11};
    std::cout << "Size of Vec1: " << vec1.size() << std::endl;
    
    std::vector<int> vec2 = mergeSort(vec1);
    std::cout << "Size of Vec2: " << vec2.size() << std::endl;
    
    for(auto& i: vec2){
        std::cout << i << " ";
    }
    std::cout << std::endl;
    return 0;
}

//while right is not full
         while (rightCurrent + 1 <= left.size())   // your bug here. It should be rightCurrent + 1 <= right.size() instead
          {
              newVector.push_back(right[rightCurrent]);
              rightCurrent++;
          }