C++ 合并排序仅返回大小为2的幂的向量

C++ 合并排序仅返回大小为2的幂的向量,c++,sorting,vector,C++,Sorting,Vector,因此,我试图编写代码来对向量进行合并排序。但是我现在有一个问题,每当我输入一个不是2的幂的向量大小时,最终排序的向量将把它的大小四舍五入到最接近的2的幂。例如,如果向量大小设置为10,则返回8,如果为100,则返回64。我不知道这是为什么。代码如下: #include <iostream> #include <stdlib.h> /* srand, rand */ #include <time.h> /* time */ #include <v

因此,我试图编写代码来对向量进行合并排序。但是我现在有一个问题,每当我输入一个不是2的幂的向量大小时,最终排序的向量将把它的大小四舍五入到最接近的2的幂。例如,如果向量大小设置为10,则返回8,如果为100,则返回64。我不知道这是为什么。代码如下:

#include <iostream>
#include <stdlib.h>     /* srand, rand */
#include <time.h>  /* time */
#include <vector>
#include <assert.h>
#include <iterator>
#include <algorithm> 
#include <functional> 
using namespace std;

vector<int> merge(vector<int> &left, vector<int> &right) {
    vector <int> result;
    while (left.size() > 0 && right.size()>0) {
        if (left[0] <= right[0]) {
            result.push_back(left[0]);
            left.erase(left.begin());
        }
        else {
            result.push_back(right[0]);
            right.erase(right.begin());
        }
    }
    if (left.size() > 0) {
        result.insert(result.end(), left.begin(), left.end());
    }
    if (right.size() > 0) {
        result.insert(result.end(), right.begin(), right.end());
    }
    return result;
}

vector <int> mergesort(vector < int > &vector_sort) {
    int size_of = vector_sort.size() / 2;
    vector <int > left(size_of), right(size_of), result(vector_sort.size());
    if (vector_sort.size() <= 1) {
        return vector_sort;
    }
    else {
        int middle = vector_sort.size() / 2;
        int counter = middle;
        int second_half = middle;
        for (int i = 0; i < middle; i++) {
            left[i] = vector_sort[i];
        }
        for (int i = 0; i < middle; i++) {
            right[i] = vector_sort[counter];
            counter++;
        }
        left = mergesort(left);
        right = mergesort(right);
        if (left.back() <= right[0]) {
            left.insert(left.end(), right.begin(), right.end());
            return left;
        }
        result = merge(left, right);
        return result;
    }
}
int main() {
    const int t=10;
    vector<int> vector_no(t);
    vector<int> empty(t);
    for (int i = 0; i < t; i++) {
        int hello = rand() % 100000 + 1;
        vector_no[i] = hello;
    }
    int hello2 = 0;
    for (int i = 0; i < vector_no.size(); i++) {
        hello2++; //I am using this for loop here just to count the size of the vector without getting a stack overflow error
    }
    cout << hello2  << "\n";
    vector_no = mergesort(vector_no);
    hello2 = 0;
    for (int i = 0; i < vector_no.size(); i++) {
        hello2++; //I am using this for loop here just to count the size of the vector without getting a stack overflow error
    }
    cout << hello2 << "\n";
}
#包括
#包括/*srand,兰特*/
#包括/*时间*/
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
向量合并(向量与左、向量与右){
矢量结果;
while(left.size()>0&&right.size()>0){
if(左[0]0){
result.insert(result.end(),left.begin(),left.end());
}
if(right.size()>0){
result.insert(result.end(),right.begin(),right.end());
}
返回结果;
}
向量合并排序(向量和向量\u排序){
int size\u of=vector\u sort.size()/2;
向量左(size_of),右(size_of),结果(vector_sort.size());

如果(vector_sort.size()在构造正确的向量时,添加的元素数等于中间值,此时应添加vector_sort.size()-中等数量的元素。由于除法向下舍入,这将导致您在奇数长度的列表中删除最后一个元素。由于您将排序向下合并为0或1个元素,这将导致结果为2的幂次幂。

当您构造右向量时,您添加的元素数量等于中间,而您应该这样做添加向量_sort.size()-中等数量的元素。由于除法舍入,这将导致您删除奇数长度列表中的最后一个元素。由于您将排序合并为0或1个元素,这将导致结果为2的幂次幂。

为了完整性,您需要这样做的原因是除法舍入并从列表中丢弃最后一个数字每个奇数大小的子数组,因此净结果始终是2的幂。为了完整性,您需要这样做的原因是除法向下舍入并丢弃每个奇数大小的子数组中的最后一个数字,因此净结果始终是2的幂。