std::sort是最直接可靠的c++原生数组排序方案,底层为introsort,需传入正确迭代器范围如std::sort(arr, arr + 5),支持自定义比较,函数传参时须显式传递长度,推荐改用std::array或std::vector。

用 std::sort 是最直接可靠的方式
对 C++ 原生数组排序,std::sort 是标准库提供的首选方案。它底层是 introsort(混合快排/堆排/插排),平均性能好、稳定且无需手动实现。关键点在于传入正确的迭代器范围:数组名退化为指针,需显式计算末尾位置。
- 对
int arr[5] = {3, 1, 4, 1, 5};排序,写法是std::sort(arr, arr + 5);,不是std::sort(arr, arr + sizeof(arr)) - 若用
sizeof(arr) / sizeof(arr[0])计算长度,只在数组为栈上定义时安全;传入函数后会退化为指针,sizeof失效 - 支持自定义比较:比如降序可写
std::sort(arr, arr + n, std::greater<int>());</int>,或传入 lambda:[](int a, int b) { return a > b; }
数组指针传参后无法直接用 std::sort
函数参数里写 void f(int arr[]) 或 void f(int* arr),实际接收的是指针,编译器完全丢失长度信息。此时 std::sort(arr, arr + ?) 中的 ? 必须由调用方显式传入,不能靠 sizeof 推导。
- 错误写法:
void f(int arr[]) { std::sort(arr, arr + sizeof(arr)/sizeof(*arr)); }—— 这里sizeof(arr)恒为指针大小(通常是 8) - 正确做法:加一个长度参数,如
void f(int arr[], size_t n) { std::sort(arr, arr + n); } - 更现代的选择:改用
std::array或std::vector,它们自带.size()方法,避免裸指针陷阱
qsort 能用但不推荐
qsort 是 C 标准库函数,C++ 中仍可用,但接口笨重、类型不安全、性能略差,且容易因比较函数签名错误导致未定义行为。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 必须写比较函数,签名固定为
int cmp(const void*, const void*),内部要强制转换,易出错 - 调用时需传元素大小:
qsort(arr, n, sizeof(int), cmp);,漏掉sizeof或写错类型会导致内存越界 - 没有模板推导,无法做编译期检查;相比
std::sort,少了内联优化机会,实测慢约 10–20%
原地排序 vs. 需要保留原数组
如果排序后还需访问原始顺序,别覆盖原数组。常见做法是复制一份再排,或用索引数组间接排序。
- 复制排序:
std::vector<int> sorted = {arr, arr + n}; std::sort(sorted.begin(), sorted.end());</int> - 索引排序(不移动原数据):
std::vector<size_t> idx(n); std::iota(idx.begin(), idx.end(), 0); std::sort(idx.begin(), idx.end(), [&](size_t i, size_t j) { return arr[i] —— 排完 <code>idx就是原数组元素的升序下标 - 注意:
std::iota在<numeric></numeric>头文件里,别漏包含
C++ 数组排序本身不难,真正容易翻车的是边界计算和传参后的长度丢失——这两处一错,轻则结果乱序,重则读越界崩溃。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










