合并排序 c++ 1 参数 - 向量

Merge Sort c++ 1 parameter - vector

本文关键字:向量 参数 排序 c++ 合并      更新时间:2023-10-16

我需要帮助创建一个函数来在C++中进行合并排序,但我仅限于 1 个参数,一个向量。我已经启动并创建了下面的代码,但它没有正确排序。如果有人能帮助我解决这个问题,我将不胜感激。谢谢。

template <class T>
vector<T> mergeSort(std::vector<T> lst){
if(lst.size() == 1){
    return lst;
}
else{
    int size = lst.size();
    int low = floor(size/2);
    int high = ceil(size/2);
    vector<T> left(lst[0], lst[low]);
    vector<T> right(lst[low], lst[size]);
    mergeSort(left);
    mergeSort(right);
    merge(lst, left, right);
    return lst;
}

}
template <class T>
vector<T> merge(vector<T>list, vector<T> left, vector<T> right){
auto l = left.begin();
auto r = right.begin();
auto a = list.begin();
while(l != left.end() && r != right.end()){
    if(*r < *l){
        *a = *r;
        r++;
    }
    else{
        *a = *l;
        left++;
    }
    a++;
}
return list;
}

您正在递归调用函数,但不使用返回的值。这里:

    mergeSort(left);
    mergeSort(right);
    merge(lst, left, right);
    return lst;

看起来好像您假设对 mergeSort(left) 的调用会修改left,但事实并非如此(参数按值传递,即进行复制(。

我没有检查所有低谷,因为这似乎是一个练习,我不想给你完整的解决方案,但你需要一些类似的东西:

    auto sorted_left = mergeSort(left);
    auto sorted_right = mergeSort(right);
    auto sorted = merge(sorted_left, sorted_right);
    return sorted;

另请注意,此实现效率极低(因为递归创建向量负载并按值传递它们(。即使这是一项练习,也是一项相当糟糕的练习。似乎它试图教你不好的做法。你应该传递迭代器或学习如何使用算法(特别是std::sort(。