std::sort配合std::greater()可实现降序排序,需包含和头文件;对内置类型最简方式是std::greater(),lambda更灵活且避免模板类型记忆。

用 std::sort 配合 std::greater<int>()</int> 最直接
默认 std::sort 是升序,要降序就得显式传入比较规则。对内置类型(如 int 数组),最省事的是用 std::greater<int>()</int> 作为第三个参数。
注意:必须包含头文件 <algorithm></algorithm> 和 <functional></functional>,后者才能用 std::greater。
#include <algorithm>
#include <functional><p>int arr[] = {3, 1, 4, 1, 5};
int n = 5;
std::sort(arr, arr + n, std::greater<int>()); // 降序排列
// 结果:{5, 4, 3, 1, 1}
</int></p></functional></algorithm>
- 如果数组是
double类型,把int换成double即可 - 不能写成
std::greater()(C++17 起虽支持,但部分旧编译器不认,显式指定类型更稳) - 若用
std::vector,调用方式一致:std::sort(v.begin(), v.end(), std::greater<int>())</int>
自己写 lambda 表达式更灵活
当比较逻辑稍复杂(比如按绝对值、或结构体字段),lambda 更直观,也避免记模板类型。
int arr[] = {-5, 3, -1, 8};
int n = 4;
std::sort(arr, arr + n, [](int a, int b) { return a > b; }); // 降序
- lambda 中
a > b表示“a 应该排在 b 前面”,即降序;别写反成a (那是升序) - 捕获列表必须为空(
[]),不能带[&]或[=],否则编译报错 - lambda 在性能上和函数对象基本无差别,现代编译器会内联
手写冒泡/快排?真没必要
除非作业强制要求或嵌入式环境连 STL 都禁用,否则自己实现排序既易出错又慢。标准库 std::sort 是混合排序(introsort),平均 O(n log n),且对小数组自动切到插入排序,实际性能远超手写。
- 常见错误:把
for (int i = 0; i 写成 <code>i ,导致越界访问 - 手写快排时分区逻辑写错,容易死循环或漏元素——这些坑
std::sort已帮你踩平 - 如果真要用 C 风格(比如
qsort),得额外写比较函数,还要传sizeof(int),更啰嗦还更难调试
字符数组或字符串数组怎么排?
字符数组(char arr[10][20])不能直接用 std::sort,因为二维数组名不是指针数组;而 std::string 数组可以,因为 std::string 支持 > 比较(字典序)。
std::string words[] = {"banana", "apple", "cherry"};
std::sort(words, words + 3, std::greater<:string>());
// 结果:{"cherry", "banana", "apple"}
</:string>
- 如果想按长度降序排,lambda 更合适:
[](const std::string& a, const std::string& b) { return a.length() > b.length(); } - C 风格字符数组建议先转成
std::vector<:string></:string>再排,别硬刚qsort+strcmp - 注意
std::greater对自定义类型无效,必须重载operator>或用 lambda
降序本身很简单,关键是别被“自己实现”的惯性带偏——STL 已经足够好,真正要花时间琢磨的是:比较逻辑是否真符合业务需求,以及迭代器范围是否写对了(arr + n 别写成 arr + n - 1)。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











