应使用std::sort排序int数组,需包含<algorithm>头文件,传首尾迭代器,支持升序(默认)和降序(用std::greater<int>()或lambda),推荐vector替代裸数组。

用 std::sort 排 int 数组最直接
别手写快排或冒泡,C++ 标准库的 std::sort 就是干这个的。它默认升序,底层是混合排序(introsort),对 int 这种 POD 类型又快又稳。
关键点:必须传入两个迭代器(首 + 尾后位置),不是数组名和长度;原地修改,不返回新数组。
-
std::sort要求头文件:#include <algorithm> - 对 C 风格数组,用
&arr[0]和&arr[n]构造指针迭代器(int*满足 RandomAccessIterator) - 对
std::array或std::vector,直接用.begin()/.end()
int arr[] = {3, 1, 4, 1, 5};
int n = sizeof(arr) / sizeof(arr[0]);
std::sort(&arr[0], &arr[n]); // 升序:{1, 1, 3, 4, 5}
降序要用 std::greater<int>() 或 lambda
默认升序是靠 operator<,降序就得显式告诉它怎么比。用 std::greater<int>() 最轻量,没额外开销;lambda 更灵活但可能影响内联(对 int 几乎无感)。
- 别写
std::sort(..., std::greater<int>)—— 少了括号会编译失败,正确是std::greater<int>() - lambda 写法:
[](int a, int b) { return a > b; },注意返回true表示a应排在b前面 - 如果数组元素是负数,降序逻辑不变,不用额外处理
std::sort(&arr[0], &arr[n], std::greater<int>()); // 降序:{5, 4, 3, 1, 1}
用 std::vector 比裸数组更安全
裸数组传大小容易错(比如 n 算错、越界访问),std::vector 把长度和数据绑在一起,.size() 不会撒谎,还能自动扩容。
立即学习“C++免费学习笔记(深入)”;
- 初始化 vector 可直接从数组拷贝:
std::vector<int> v(std::begin(arr), std::end(arr)); - 排序后取回 C 风格指针?用
&v[0](C++11 起保证连续)或v.data() - 如果只是临时排序且不关心内存分配,裸数组够用;但涉及增删、函数传参、生命周期管理,vector 是默认选择
std::vector<int> v = {3, 1, 4, 1, 5};
std::sort(v.begin(), v.end()); // 升序
常见错误:越界、类型不匹配、忘记头文件
这些错不报语法问题,但行为未定义或编译失败:
- 写成
std::sort(arr, arr + n + 1)→ 越界读,可能 crash 或乱序 - 传
int arr[5]给期望std::vector<int>&的函数 → 类型不匹配,编译不过 - 漏
#include <algorithm>→ GCC/Clang 报‘sort’ is not a member of ‘std’ - 用
std::sort排std::list→ 编译失败,因为 list 不支持随机访问迭代器;得用.sort()成员函数
裸数组排序本身没性能陷阱,但若在循环里反复排序大数组,瓶颈从来不在 std::sort,而在你为什么需要反复排序。










