应直接使用std::sort而非手写排序算法,因其底层为introsort,平均与最坏时间复杂度均为o(n log n),并针对小数组自动切换插入排序;对原生数组排序需传首尾指针(如arr, arr+n),常见错误包括传长度、漏末元素或指针长度计算错误;std::array和std::vector更安全,支持.begin()/.end();自定义比较可用lambda,如降序或按绝对值排序。

直接用 std::sort,别手写快排或冒泡——它底层是混合排序(introsort),平均和最坏都是 O(n log n),且针对小数组自动切到插入排序,比自己写的更稳更快。
用 std::sort 对原生数组升序排序
关键点不是“能不能”,而是“怎么传对指针”。std::sort 要两个随机访问迭代器,对原生数组就是首尾地址:
示例:
#include <algorithm>
#include <iostream><p>int main() {
int arr[] = {5, 2, 8, 1, 9};
size_t n = sizeof(arr) / sizeof(arr[0]);
std::sort(arr, arr + n); // ✅ 正确:arr 是首地址,arr + n 是末尾+1
// 输出:1 2 5 8 9
}</p></iostream></algorithm>
常见错误:
- 写成
std::sort(arr, n)—— 编译失败,第二个参数必须是指针/迭代器,不是长度 - 写成
std::sort(&arr[0], &arr[n-1])—— 排序范围漏掉最后一个元素 - 对
int*指针变量调用时没算准长度,比如int* p = new int[10]; std::sort(p, p + 10);必须自己记长度,std::size(p)不合法
对 std::array 或 std::vector 排序更安全
它们自带 .begin()/.end(),不用手动算地址,也不怕退化成指针:
#include <array>
#include <vector>
#include <algorithm><p>std::array<int> a = {5, 2, 8, 1, 9};
std::sort(a.begin(), a.end()); // ✅ 安全,类型明确</int></p>
<p>std::vector<int> v = {5, 2, 8, 1, 9};
std::sort(v.begin(), v.end()); // ✅ 自动适应 size 变化</int></p></algorithm></vector></array>
注意:std::array 长度必须编译期确定;std::vector 动态分配,但排序仍只操作已有元素,不改变容量。
自定义比较逻辑(比如降序、按绝对值)
第三个参数传 lambda 或函数对象。升序是默认行为,等价于 std::less<int>{}</int>,但显式写出来更清晰:
- 降序:
std::sort(v.begin(), v.end(), [](int a, int b) { return a > b; }); - 按绝对值升序:
std::sort(v.begin(), v.end(), [](int a, int b) { return abs(a) - 避免在 lambda 里捕获局部变量导致悬垂引用,尤其当容器生命周期短于排序调用时
如果比较逻辑复杂或复用频繁,定义命名函数对象比长 lambda 更易读、易调试。
真正容易被忽略的是:排序算法不保证相等元素的相对位置(即不稳定),如果需要稳定排序,得换 std::stable_sort;另外,所有元素类型必须支持 operator,否则要提供完整比较谓词——比如对结构体排序时,忘了定义 <code>operator 或传错 lambda,编译器报错信息会很长,但根源就在这儿。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











