std::sort可直接排序short数组,需传入正确迭代器边界;排序指针数组时须自定义比较函数;short类型无额外开销,但需注意字节序和旧编译器兼容性。

用 std::sort 排 short 数组最直接
只要数组是连续内存(比如 short arr[100] 或 std::vector<short></short>),std::sort 就能直接用,不需要额外适配。它按值大小升序排,底层用的是 introsort(快排+堆排+插排混合),对 short 这种小整型很高效。
常见错误是传错迭代器边界:比如把数组长度当指针用,或者对指针数组误操作。
-
std::sort(arr, arr + n)—— 正确,arr是short*,arr + n是末尾后一位 - 别写成
std::sort(arr, n)—— 编译不过,第二个参数必须是指针或迭代器 - 如果用
std::vector<short> v</short>,就写std::sort(v.begin(), v.end())
排序 short 指针数组要小心比较逻辑
如果你实际存的是 short*(比如 short* ptrs[10]),那默认 std::sort 排的是指针地址,不是它们指向的值。这时候必须传自定义比较函数。
典型场景:你有一组动态分配的 short 值,想按数值大小重新排列这些指针。
立即学习“C++免费学习笔记(深入)”;
- 错误写法:
std::sort(ptrs, ptrs + 10)→ 按内存地址排,结果不可控 - 正确写法:
std::sort(ptrs, ptrs + 10, [](short* a, short* b) { return *a - 注意空指针:如果数组里可能有
nullptr,比较函数里得先判空,否则解引用崩溃
qsort 能用但没必要,还容易出错
C 风格的 qsort 支持 short,但需要手写比较函数,类型转换稍烦,而且没有模板推导,编译期不检查参数类型。
常见错误是 sizeof(short) 写错、指针强转漏 *、或比较函数返回值不符合规范(必须是负/零/正整数)。
- 正确比较函数:
int cmp(const void* a, const void* b) { return *(short*)a - *(short*)b; } - 调用:
qsort(arr, n, sizeof(short), cmp) - 风险点:减法可能溢出(比如
-32768 - 32767),安全写法是用*(short*)a *(short*)b)
性能和兼容性:short 排序没特殊开销
short 是整型,std::sort 对它的搬运、比较、交换都走最优路径,不会因为位宽小就变慢或出问题。C++17 起支持并行策略(std::execution::par),但对小数组(比如几百个 short)反而更慢,别乱加。
跨平台没问题,但注意:某些嵌入式平台或老编译器(如 VS2013 以前)的 std::sort 实现对小类型优化不足,如果实测卡顿,可考虑改用 std::stable_sort(它在小数据上常切到插入排序)。
真正容易被忽略的是:如果你从文件或网络读进来的 short 是大端序,而本地是小端,std::sort 会照原样排——它不关心字节序,只按内存里的二进制值比。这时候得先做字节序转换,再排。










