C++ C++;合并排序获取垃圾元素
我们的讲师让我们先创建自己的合并排序算法,然后再向我们展示如何创建一个。他解释了它是如何工作的,这就是我想到的。它可以工作,但有一个bug,我的代码捕捉到了垃圾号。第一个垃圾数出现在向量/数组大小为7时,然后是11,依此类推。 此代码的输出为: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); 标准::向量合并排序(标准
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++;
}