• C++ partial_sort()排序函数用法详解(深入了解,一文学会)


            partial_sort()分为partial_sort()和partial_sort_copy()两种函数。

            partial_sort()排序函数主要用在非常大的容器筛选最大或者最小值来使用,例如:容器A有100万个元素,需要找出最大或者最小的10个元素,这时候就需要用到partial_sort()和partial_sort_copy()两种函数。

            partial_sort() 重新调整容器元素顺序,达到选出最大值或者最小值的目的;partial_sort_copy() 通过复制出最大值或者最小值的方式来达到目的;具体代码请参考下面Demo。

       本文作者原创,转载请附上文章出处与本文链接。

    partial_sort()排序函数用法详解目录

    1 partial_sort()排序函数

    2 partial_sort_copy()排序函数


            partial_sort() 和 partial_sort_copy() 函数都位于 头文件中,因此在使用这 2 个函数之前,程序中应引入此头文件:

        #include 

    1 partial_sort()排序函数

            一个函数的功能往往可以从它的函数名中体现出来,以 partial_sort() 函数为例,partial sort 可直译为“部分排序”。partial_sort() 函数的功能确是如此,即该函数可以从指定区域中提取出部分数据,并对它们进行排序。

            但“部分排序”仅仅是对 partial_sort() 函数功能的一个概括,如果想彻底搞清楚它的功能,需要结合该函数的语法格式。partial_sort() 函数有 2 种用法,其语法格式分别为:

    1. //按照默认的升序排序规则,对 [first, last) 范围的数据进行筛选并排序
    2. void partial_sort (RandomAccessIterator first,
    3. RandomAccessIterator middle,
    4. RandomAccessIterator last);
    5. //按照 comp 排序规则,对 [first, last) 范围的数据进行筛选并排序
    6. void partial_sort (RandomAccessIterator first,
    7. RandomAccessIterator middle,
    8. RandomAccessIterator last,
    9. Compare comp);

    其中,first、middle 和 last 都是随机访问迭代器,comp 参数用于自定义排序规则。
            partial_sort() 函数会以交换元素存储位置的方式实现部分排序的。具体来说,partial_sort() 会将 [first, last) 范围内最小(或最大)的 middle-first 个元素移动到 [first, middle) 区域中,并对这部分元素做升序(或降序)排序。

            需要注意的是,partial_sort() 函数受到底层实现方式的限制,它仅适用于普通数组和部分类型的容器。换句话说,只有普通数组和具备以下条件的容器,才能使用 partial_sort() 函数:

    • 容器支持的迭代器类型必须为随机访问迭代器。这意味着,partial_sort() 函数只适用于 array、vector、deque 这 3 个容器。
    • 当选用默认的升序排序规则时,容器中存储的元素类型必须支持 <小于运算符;同样,如果选用标准库提供的其它排序规则,元素类型也必须支持该规则底层实现所用的比较运算符;
    • partial_sort() 函数在实现过程中,需要交换某些元素的存储位置。因此,如果容器中存储的是自定义的类对象,则该类的内部必须提供移动构造函数和移动赋值运算符。
    1. #include
    2. #include
    3. #include // std::vector
    4. using namespace std;
    5. //以普通函数的方式自定义排序规则
    6. bool mycomp1(int i, int j) {
    7. return (i > j);
    8. }
    9. //以函数对象的方式自定义排序规则
    10. class mycomp2 {
    11. public:
    12. bool operator() (int i, int j) {
    13. return (i > j);
    14. }
    15. };
    16. int main()
    17. {
    18. std::vector<int> myvector{ 3,2,5,4,1,6,9,7 };
    19. //以默认的升序排序作为排序规则,将 myvector 中最小的 4 个元素移动到开头位置并排好序
    20. std::partial_sort(myvector.begin(), myvector.begin() + 4, myvector.end());
    21. cout << "第一次排序:\n";
    22. for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)
    23. std::cout << *it << ' ';
    24. cout << "\n第二次排序:\n";
    25. // 以指定的 mycomp2 作为排序规则,将 myvector 中最大的 4 个元素移动到开头位置并排好序
    26. std::partial_sort(myvector.begin(), myvector.begin() + 4, myvector.end(), mycomp2());
    27. for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)
    28. std::cout << *it << ' ';
    29. return 0;
    30. }

     partial_sort() 函数实现排序的平均时间复杂度为N*log(M),其中 N 指的是 [first, last) 范围的长度,M 指的是 [first, middle) 范围的长度。

    2 partial_sort_copy()排序函数

            partial_sort_copy() 函数的功能和 partial_sort() 类似,唯一的区别在于,前者不会对原有数据做任何变动,而是先将选定的部分元素拷贝到另外指定的数组或容器中,然后再对这部分元素进行排序。

    partial_sort_copy() 函数也有 2 种语法格式,分别为:

    1. //默认以升序规则进行部分排序
    2. RandomAccessIterator partial_sort_copy (
    3. InputIterator first,
    4. InputIterator last,
    5. RandomAccessIterator result_first,
    6. RandomAccessIterator result_last);
    7. //以 comp 规则进行部分排序
    8. RandomAccessIterator partial_sort_copy (
    9. InputIterator first,
    10. InputIterator last,
    11. RandomAccessIterator result_first,
    12. RandomAccessIterator result_last,
    13. Compare comp);

    其中,first 和 last 为输入迭代器;result_first 和 result_last 为随机访问迭代器;comp 用于自定义排序规则。

            partial_sort_copy() 函数会将 [first, last) 范围内最小(或最大)的 result_last-result_first 个元素复制到 [result_first, result_last) 区域中,并对该区域的元素做升序(或降序)排序。

            [first, last] 中的这 2 个迭代器类型仅限定为输入迭代器,这意味着相比 partial_sort() 函数,partial_sort_copy() 函数放宽了对存储原有数据的容器类型的限制。换句话说,partial_sort_copy() 函数还支持对 list 容器或者 forward_list 容器中存储的元素进行“部分排序”,而 partial_sort() 函数不行。

            介于 result_first 和 result_last 仍为随机访问迭代器,因此 [result_first, result_last) 指定的区域仍仅限于普通数组和部分类型的容器,这和 partial_sort() 函数对容器的要求是一样的。

    1. #include
    2. #include
    3. #include // std::list
    4. using namespace std;
    5. bool mycomp1(int i, int j) {
    6. return (i > j);
    7. }
    8. class mycomp2 {
    9. public:
    10. bool operator() (int i, int j) {
    11. return (i > j);
    12. }
    13. };
    14. int main()
    15. {
    16. int myints[5] = { 0 };
    17. std::list<int> mylist{ 3,2,5,4,1,6,9,7 };
    18. //按照默认的排序规则进行部分排序
    19. std::partial_sort_copy(mylist.begin(), mylist.end(), myints, myints + 5);
    20. cout << "第一次排序:\n";
    21. for (int i = 0; i < 5; i++) {
    22. cout << myints[i] << " ";
    23. }
    24. //以自定义的 mycomp2 作为排序规则,进行部分排序
    25. std::partial_sort_copy(mylist.begin(), mylist.end(), myints, myints + 5, mycomp2());
    26. cout << "\n第二次排序:\n";
    27. for (int i = 0; i < 5; i++) {
    28. cout << myints[i] << " ";
    29. }
    30. return 0;
    31. }

  • 相关阅读:
    时序处理的一些命令
    Java开发中List数据量大,需要分片批次处理
    python经典案例:抓交通肇事者
    [附源码]java毕业设计高要某高校教务处排课系统
    C#-SQLite-使用教程笔记
    什么是 Infamous Skullz NFT 系列?
    攻防世界碎纸机11
    数据结构之:链表
    如何选择高频器件功分器和耦合器的PCB材料
    shell脚本之数组
  • 原文地址:https://blog.csdn.net/qq_37529913/article/details/122904952