C++中std::partial_sort的使用小结

 更新时间:2025年04月07日 11:15:11   作者:点云SLAM  
std::partial_sort 是 C++ 标准库中的一个算法,它可以对容器中的一部分元素进行排序,本文主要介绍了C++中std::partial_sort的使用小结,感兴趣的可以了解一下

std::partial_sort 是 C++ 标准库中的一个算法,它可以对容器中的一部分元素进行排序,使得前 N 个元素按顺序排列,而不保证剩余部分有序。它的时间复杂度为 O(N log N + (M-N)),其中 M 是整个范围的大小,N 是要排序的元素数量。

1. 语法

#include <algorithm>

template< class RandomIt >
void partial_sort( RandomIt first, RandomIt middle, RandomIt last );

template< class RandomIt, class Compare >
void partial_sort( RandomIt first, RandomIt middle, RandomIt last, Compare comp );
  • first:要排序的范围的起始迭代器。
  • middle:指定排序后的前 N 个元素的终点,即 first + N
  • last:排序范围的结束迭代器。
  • comp(可选):自定义比较函数。

2. 基本用法

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {7, 3, 9, 1, 6, 2, 8, 5, 4};

    // 仅对前 5 个元素排序
    std::partial_sort(vec.begin(), vec.begin() + 5, vec.end());

    // 输出前 5 个排序后的元素
    std::cout << "前 5 个最小的元素: ";
    for (int i = 0; i < 5; ++i) {
        std::cout << vec[i] << " ";
    }
    std::cout << "\n";

    // 输出整个数组
    std::cout << "整个数组: ";
    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << "\n";

    return 0;
}

输出

前 5 个最小的元素: 1 2 3 4 5 
整个数组: 1 2 3 4 5 9 8 7 6 

注意:前 5 个元素是有序的,但整个数组仍然是部分无序的。

3. 使用自定义比较函数

可以使用 std::greater<int>() 进行降序排序:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {7, 3, 9, 1, 6, 2, 8, 5, 4};

    // 获取前 5 个最大的元素(降序)
    std::partial_sort(vec.begin(), vec.begin() + 5, vec.end(), std::greater<int>());

    // 输出前 5 个排序后的元素
    std::cout << "前 5 个最大的元素: ";
    for (int i = 0; i < 5; ++i) {
        std::cout << vec[i] << " ";
    }
    std::cout << "\n";

    return 0;
}

输出

前 5 个最大的元素: 9 8 7 6 5 

4. 与 std::sort 和 std::nth_element 的比较

算法作用复杂度适用场景
std::sort全部排序O(N log N)需要排序整个序列
std::partial_sort仅保证前 N 个元素有序O(N log N + (M-N))只需要最小/最大 N 个有序元素
std::nth_element只保证 N 处的元素正确,左侧比它小,右侧比它大O(M)只需要找到第 N 小的元素,且不关心其他元素顺序

5. 适用场景

  • 求前 K 个最小/最大值
  • 数据流处理(流式计算)
  • Top-K 查询
  • 快速获取排名前 N 的元素

到此这篇关于C++中std::partial_sort的使用小结的文章就介绍到这了,更多相关C++ std::partial_sort内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • C语言合并两个带头节点升序排列链表

    C语言合并两个带头节点升序排列链表

    这篇文章主要为大家详细介绍了C语言合并两个带头节点升序排列链表的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C++ AVL树的两单旋和两双旋的项目实践

    C++ AVL树的两单旋和两双旋的项目实践

    本文主要介绍了C++ AVL树的两单旋和两双旋的项目实践,根据节点插入位置的不同,AVL树的旋转分为四种,下面就来介绍一下,感兴趣的可以了解一下
    2024-03-03
  • C语言实现查询自动售货机中的商品价格【实例分享】

    C语言实现查询自动售货机中的商品价格【实例分享】

    本文主要介绍了C语言实现查询自动售货机中的商品价格的相关资料。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • 深入了解C++智能指针的使用

    深入了解C++智能指针的使用

    智能指针的本质就是使用一个对象来接管一段开辟的空间,在该对象在销毁的时候,自动调用析构函数来释放这段内存。本文就来和大家详细聊聊智能指针的使用,需要的可以参考一下
    2022-10-10
  • C语言实现学生成绩管理系统课程设计

    C语言实现学生成绩管理系统课程设计

    这篇文章主要为大家详细介绍了C语言实现学生成绩管理系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • C++操作文件进行读取、删除、修改指定行

    C++操作文件进行读取、删除、修改指定行

    今天小编就为大家分享一篇关于C++操作文件进行读取、删除、修改指定行,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++ OpenCV裁剪图片时发生报错的解决方式

    C++ OpenCV裁剪图片时发生报错的解决方式

    在图像处理中,我们经常根据需要截取图像中某一区域做处理,下面这篇文章主要给大家介绍了关于C++ OpenCV裁剪图片时发生报错的解决方式,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • C语言函数多个返回值方式

    C语言函数多个返回值方式

    这篇文章主要介绍了C语言函数多个返回值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C++利用stringstream进行数据类型转换实例

    C++利用stringstream进行数据类型转换实例

    这篇文章主要介绍了C++利用stringstream进行数据类型转换的方法,实例分析了使用stringstream进行string转int的操作技巧,需要的朋友可以参考下
    2015-01-01
  • C语言内存泄漏常见情况及解决方案详解

    C语言内存泄漏常见情况及解决方案详解

    这篇文章主要为大家介绍了C语言内存泄漏常见情况及解决方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论