C++常用库函数---sort排序

sort

简单介绍

sort函数包含于 <algorithm> 头文件中,是C++标准库中的函数模板,用于对指定范围内的元素进行排序。其底层实现结合了快速排序、堆排序和插入排序(内省排序),平均时间复杂度为 O(n log n),最坏情况时间复杂度为 O(n²),但实际场景中通过优化策略极少出现最坏情况。默认排序规则为 从小到大(升序)。


模板用法

1. 基础用法:数组与容器
 // 数组示例(注意:索引从1开始需确保数组足够大)
 int a[1005];
 int n;
 cin >> n;
 for(int i = 1; i <= n; i++) cin >> a[i];
 sort(a + 1, a + n + 1); // 左闭右开区间:[a+1, a+n+1)
 for(int i = 1; i <= n; i++) cout << a[i] << ' ';
 ​
 // vector示例(推荐使用容器)
 vector<int> v = {5, 3, 1, 4, 2};
 sort(v.begin(), v.end()); // 排序范围为 [begin(), end())
 // 正确输出方式(索引从0开始)
 for(int i = 0; i < v.size(); i++) cout << v[i] << ' ';
 // 或使用范围循环
 for(auto i : v) cout << i << ' ';
2. 自定义比较函数

比较函数决定元素顺序规则:

  • 若返回 true,则第一个参数应排在第二个参数之前。

  • 需满足严格弱序(例如,不能出现 a < bb < a 同时为真)。

方式一:普通函数
 // 降序排列
 bool cmp(int x, int y) { return x > y; } // 注意分号为英文符号
 ​
 vector<int> v = {2, 8, 9, 5, 2};
 sort(v.begin(), v.end(), cmp);
方式二:Lambda表达式(匿名函数)
 vector<int> v = {2, 8, 9, 5, 2};
 sort(v.begin(), v.end(), [](int x, int y) {
     return x > y; // 降序规则
 });
3. 结构体排序示例
 struct Student {
     string name;
     int score;
 };
 ​
 // 按分数降序排列
 bool cmp_score(const Student& a, const Student& b) {
     return a.score > b.score;
 }
 ​
 int main() {
     vector<Student> students = {{"Alice", 90}, {"Bob", 85}, {"Cathy", 95}};
     sort(students.begin(), students.end(), cmp_score);
     // 输出结果:Cathy 95, Alice 90, Bob 85
 }

注意事项

  1. 迭代器有效性:确保排序范围合法,如 begin() <= end(),且不越界。

  2. 稳定性sort 是不稳定排序,若需稳定排序请使用 stable_sort

  3. 效率:对大型数据优先使用 vector 而非原生数组,避免手动管理内存。

  4. 比较函数:避免在比较函数中修改元素,否则行为未定义。


扩展知识

  • 内省排序:结合快排、堆排和插入排序,避免快排的最坏情况。

  • Lambda捕获:可通过 [=][&] 捕获外部变量(需谨慎使用)。

通过灵活使用 sort 和自定义规则,可高效处理各类排序需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王嘉俊925

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值