首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将向量排序到中等大(前端和前端小)的最佳方法

将向量排序到中等大(前端和前端小)的最佳方法
EN

Stack Overflow用户
提问于 2021-04-11 14:51:43
回答 1查看 41关注 0票数 0
代码语言:javascript
运行
复制
std::vector<int> arr = {2,1,3,4,5};

middle_big_sort(arr);

在排序之后

代码语言:javascript
运行
复制
arr == {2,4,5,3,1}

我的解决方案是:

代码语言:javascript
运行
复制
std::vector<int> middle_big_sort(const std::vector<int>& arr) {
    std::vector<int> temp1 = arr;
    std::vector<int> temp2 = arr;
    std::vector<int> ret;
    std::sort(temp2.begin(), temp2.end());
    std::sort(temp1.begin(), temp1.end(), std::less<int>());
    temp1.insert(temp1.end(), temp2.begin(), temp2.end());
    ret.reserve(arr.size());
    for (int i = 0; i < temp1.size(); i+=2) {
        ret.push_back(temp1[i]);
    }
    return ret;
}

有没有更快的方法?

EN

回答 1

Stack Overflow用户

发布于 2021-04-11 17:19:16

我想您可以尝试这样的方法来防止某些复制和排序操作。

代码语言:javascript
运行
复制
auto middle_big_sort(std::vector<int> arr) -> decltype(arr) {
    decltype(arr) ret(arr.size());
    std::sort(arr.begin(), arr.end());
    arr.push_back(arr.back()); // prevents messing with boundaries in loop
    for (int i = 0; i < ret.size() / 2 + 1; i++) {
        ret[ret.size() - i - 1] = arr[i * 2];
        ret[i]                  = arr[i * 2 + 1];
    }
    return ret;
}

但肯定有更多的最优解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67042202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档