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 < b
和b < 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
}
注意事项
-
迭代器有效性:确保排序范围合法,如
begin() <= end()
,且不越界。 -
稳定性:
sort
是不稳定排序,若需稳定排序请使用stable_sort
。 -
效率:对大型数据优先使用
vector
而非原生数组,避免手动管理内存。 -
比较函数:避免在比较函数中修改元素,否则行为未定义。
扩展知识
-
内省排序:结合快排、堆排和插入排序,避免快排的最坏情况。
-
Lambda捕获:可通过
[=]
或[&]
捕获外部变量(需谨慎使用)。
通过灵活使用 sort
和自定义规则,可高效处理各类排序需求。