c++ STL 之排序——sort、partial sort、stable sort、merge 详解

目录

 一、sort

二、partial sort

三、stable sort

四、merge

补充:

 一、sort

    为什么一个讲 sort 的文章还要有一个篇章就叫 sort 呢?难道还有不叫 sort 的排序吗?yes!

    sort 其实并不完全是用的是快速排序排集合了堆排序和插入排序,如果需要纯快排,请使用qsort。sort 会根据不同的数量级别以及不同情况,能自动选用合适的排序方法。一般快速排序一旦分段后的数据量小于某个阀值,为避免递归调用带来过大的额外负荷,便会改用插入排序。而如果递归层次过深,有出现最坏情况的倾向,还会改用堆排序。

    所以无论元素初始时为何种状态,sort()的平均排序复杂度为均为 O(n\times \log_2(n)),具有不错的的性能。

例题:

#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
    int n, a[1000000005];
    cin>>n;
    for (int i = 1; i <= n; i ++)
    {
        cin >> a[i];
    }
    sort(a + 1, a + n + 1);
    for (int i = 1; i <= n; i ++)
    {
        cout << a[i] << ' ';
    }
    return 0;
}

注意⚠️:请勿抄袭代码,否则将受到封号或棕名惩罚。

    除了数组,对于 deque 这种可以随机访问地址的数据结构,也可以 sort 排序。

二、partial sort

    我先出一道题,给全校同学的成绩,输出在全校成绩排名前10的人的成绩。排序啊! 然后如果把全校同学的成绩都排序,那未免有点太浪费了,我们可不可以只挑选出前10名的同学的成绩呢? 这时候我们就要用到 partial sort。

    partial sort 有三个参数,第一个参数表示起始位置,第二个参数表示排序要排到这里,第三个参数表示终止位置,时间复杂度超快平均,平均竟然是 O(last-begin),可以参考partial_sort 头文件

三、stable sort

    sort 固然不是稳定排序,如果想要稳定排序,需要手写代码:

#include <algorithm>
#include <iostream>
using namespace std;
struct stable_int
{
    int num;
    int id;
    bool operator<(const stable_int& other) const
    {
        if(num < other.num)
        {
            return id < other.id;
        }
        return num < other.num;
    }
}a[1000000005];
int main()
{
    int n,;
    cin>>n;
    for (int i = 1; i <= n; i ++)
    {
        cin >> a[i].num;
    }
    sort(a + 1, a + n + 1);
    for (int i = 1; i <= n; i ++)
    {
        cout << a[i].num << ' ';
    }
    return 0;
}

    手写代码显然太慢,于是就有了 stable_sort,默认稳定排序,可以参考

stable_sort 头文件

四、merge

    两个已经排好序的数组从新排序当然浪费时间,本来 O(n+m) 的排序硬是变成了O((n+m)\times \log_2(n+m)),于是就有了 merge。

    merge 有足足 5 个参数,前两个参数是第一个数组的起始和结束位置,后两个参数是第二个数组的起始和结束位置,最后一个参数为结果安放的位置,可以参考
merge 头文件

补充:

  • 四个函数均可以补充一个参数,为比较函数 comp。
  • 均函数均需引用 algorithm 头文件。

你学会了吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值