排序
1. sort简介
-
头文件: 包含在
中,使用前需要#include
或使用万能头文件<bits/stdc++.h> -
算法特性: C++标准库中的函数模板,使用快速排序(QuickSort)或改进算法,平均时间复杂度为
O(nlogn)
-
适用范围: 可对任何可比较元素进行排序,无需关心内部具体实现
2.sort的用法
- 基本语法: sort(起始地址,结束地址的下一位,*比较函数)
- 数组排序示例:
- 定义数组int a[1000]
- 输入n和数组元素
- 排序语句:sort(a+1, a+n+1) // 左闭右开区间[1,n+1)
- 默认规则: 不写比较函数时默认使用小于号比较,结果为升序
- vector排序:
- 使用迭代器:sort(v.begin(), v.end())
- 输出方式:常规for循环或for(auto i:v)遍历
- 区间特性: 同样遵循左闭右开原则,begin()指向首元素,end()指向末元素的下一位
- 输出技巧: 可使用条件判断控制末尾空格/换行:"\n"[i==n]
3. 自定义比较函数
- 函数形式:
- 定义bool cmp(const int &u, const int &v)
- 调用时传入函数名:sort(v.begin(), v.end(), cmp)
- lambda表达式:
- 语法:捕获列表
- 示例:sort(v.begin(), v.end(), [](const int &u, const int &v){return u > v;})
- 结构体重载:
- 重载operator<实现多关键字排序
- 示例:先按u排序,u相等时按v排序
- 注意事项:
- 比较函数返回值必须为bool类型
- 结构体重载时参数只有一个,作为右操作数
- const和引用(&)可省略但建议保留
4. 应用案例
1)例题:先升序后降序输出数组元素
- 解题思路:
- 直接使用默认sort升序排列后输出
- 降序输出方案:
- 方案一:反向遍历输出
- 方案二:使用自定义比较函数再次排序
- 实现细节:
- 数组大小定义:const int N = 5e5+3
- 输入输出优化:ios::sync_with_stdio(0)
- 输出格式控制:使用条件表达式处理末尾空格
- 性能对比:
- 反向输出方案运行时间更优(5ms)
- 二次排序方案内存消耗相同但耗时略长
- 易错点:
- 区间范围容易混淆(注意左闭右开)
- 自定义比较函数返回值类型错误
- 输出格式控制不当导致格式错误

浙公网安备 33010602011771号