(STL)泛型函数②-排序/次序整理算法(常用)

目录

1.sort()  【排序】

2.reverse()  【逆序】

3.merge()  【合并】

4.partial_sort()  【部分排序】

5.partition()  【分割】


1.sort()  【排序】

接收两个参数:first,last,即排序的起始位置和终止位置,该函数默认从小到大排序,

若想按照自己的方式排序(如从大到小排序),可以在函数中加入第三个参数cmp:

例:

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

bool cmp(int a, int b) {
    return a > b;
}
int main() {
    std::vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6, 5};

    std::sort(numbers.begin(), numbers.end(), cmp);

    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

2.reverse()  【逆序】

接收两个参数:同sort()函数一样,接收first和last两个参数,用于实现first至last范围内元素的逆序操作。它会将容器中的元素按照相反的顺序重新排列,即将第一个元素与最后一个元素交换,第二个元素与倒数第二个元素交换,以此类推,直到所有元素都被重新排列

例:

#include <iostream>
#include <vector>
#include <algorithm>
int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    std::reverse(numbers.begin(), numbers.end());

    
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
//输出5 4 3 2 1
    return 0;
}

3.merge()  【合并】

该函数接收5个参数:first_1,last_1,first_2,last_2,合并结果的目标位置

该函数用于将两个已排序的序列合并成一个新的有序序列。这个函数通常用于合并两个有序的容器,比如两个已排序的向量或双端队列

例:

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

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

    std::vector<int> merged(vec1.size() + vec2.size());

    std::merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), merged.begin());

    for (int num : merged) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
//输出1 2 3 4 5 6 7 8 9 10
    return 0;
}

在这个程序中,由于输入序列已经排序,因此合并过程中只需要线性时间,时间复杂度为 O(n)

4.partial_sort()  【部分排序】

传入三个参数:容器起始位置first,排序的终止位置end,容器终止位置last

该函数用于部分排序一个序列,即将序列中的部分元素排列到前面,使它们按照顺序排列,而不对整个序列进行排序。这个函数在需要找到前 k 个最小(或最大)元素时非常有用,而不需要对整个序列进行排序

例:

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

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

    std::partial_sort(vec.begin(), vec.begin() + 4, vec.end());

    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
//输出1 2 3 4 7 5 8 6 9
    return 0;
}

同sort()函数一样,该函数默认从小到大排序,但同样可以加入第四个参数cmp,以自定义方式排序。

5.partition()  【分割】

该函数接收三个参数:起始位置first,终止位置last,判断方式

该函数用于对容器中的元素进行分区,将满足特定条件的元素移动到容器的前部,而不满足条件的元素移动到容器的后部。

例:

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

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

    // 将偶数移动到容器前部
    std::partition(vec.begin(), vec.end(), [](int i) { return i % 2 == 0; });

    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
//输出4 2 8 6 7 3 5 1 9
    return 0;
}

该函数在需要对容器中的元素进行分割,使得满足某种条件的元素和不满足条件的元素分别位于容器的两个部分时非常有用。

--------------------------------------------------------------------------------------------------------------------------------

觉得有用就点点关注收藏一下吧~谢谢支持!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值