std::sort 是对普通数组排序最简单可靠的方法,底层为 introsort,平均时间复杂度 O(n log n),需传指针范围如 std::sort(arr, arr + 5),避免手写快排的边界错误。
std::sort 对普通数组排序最简单可靠绝大多数情况下,直接调用 std::sort 是最优解。它底层是 introsort(混合快排+堆排+插入排序),平均 O(n log n),且经过高度优化,比手写快排更稳、更快。
注意:必须传入指针范围,不能直接传数组名(会退化为指针,丢失长度)。
int arr[5] 排序:用 std::sort(arr, arr + 5),不是 std::sort(arr, arr + sizeof(arr))
std::vector,写法更安全:std::sort(vec.begin(), vec.end())
std::sort(arr, arr + n, std::greater())
partition 边界容易出错手写快排常见崩溃或死循环,基本都出在 partition 函数的 while 循环条件和指针移动顺序上。尤其当数组含重复元素或已有序时,边界越界或左右指针卡住很常见。
推荐使用「Lomuto 分区方案」并严格检查索引:
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr[j] <= pivot) {
i++;
std::swap(arr[i], arr[j]);
}
}
std::swap(arr[i + 1], arr[high]);
return i + 1;
}j (不是 ),避免访问 arr[high] 两次
std::swap(arr[i + 1], arr[high]),否则 pivot 位置错误[low, pi - 1] 和 [pi + 1, high],不能漏掉 +1/-1
std::array 或 std::vector 排序,别忘了包含头文件新手常因漏掉 #include 导致 std::sort 报错,而编译器提示可能只显示 “not declared in this scope”,并不明确指出缺头文件。
std::array a = {3,1,4,1,5}; → 排序写法同原生数组:std::sort(a.begin(), a.end())
std::vector v = {3,1,4,1,5}; → 同样用 v.begin()/v.end(),支持动态大小std::ranges::sort(v),但需额外包含
对结构体数组调用 std::sort 时,若没传比较函数,编译器会尝试调用 operator。如果没定义,就报错;如果定义了但逻辑有误(比如未覆盖所有字段、返回非严格弱序),运行时可能行为异常(如排序不完整、崩溃)。
推荐显式传 lambda,清晰且不易出错:
struct Person {
std::string name;
int age;
};
std::vector people = {{"Alice", 30}, {"Bob", 25}};
std::sort(people.begin(), people.end(), [](const Person& a, const Person& b) {
return a.age < b.age; // 按年龄升序
}); const Person& 避免拷贝开销a.age != b.age ? a.age
C++ 数组排序真正难的不是算法本身,而是指针边界、容器迭代器有效性、比较谓词的数学正确性——这些地方一错,轻则结果错,重则段错误,且很难调试。
# c++
# 排序算法
# c++数组
# sort
# while
# 插入排序
# int
# 循环
# 指针
# 堆
# 算法
# 报错
# 递归
# 最简单
# 头文件
# 升序
# 很难
# 推荐使用
# 两次
# 自定义
# 只显示
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
PythonDocker高级项目部署教程_多容器管理与CI/CD流水线
c# await 一个已经完成的Task会发生什么
Ajax提交表单PHP怎么接收_处理Ajax发送的表单数据技巧【指南】
Win11任务栏怎么放到顶部_Win11修改任务栏位置方法【详细】
Win11开机Logo怎么换_Win11自定义启动画面工具【高级】
Windows10系统怎么查看防火墙状态_Win10安全中心网络保护
MAC如何设置网卡MAC地址克隆_MAC终端修改物理地址与环境模拟【教程】
Win10怎样清理C盘阿里旺旺缓存_Win10清理阿里旺旺缓存步骤【步骤】
c++中如何进行二进制文件读写_c++ read与write函数用法
Win10怎样安装PPT模板_Win10安装PPT模板教程【步骤】
php查询数据怎么导出csv_查询结果转csv文件保存【操作】
c++的static关键字有什么用 静态变量和静态函数的应用场景【教程】
Win11怎么关闭自动维护 Win11禁用系统自动维护功能【优化】
Win11怎么连接蓝牙耳机_Win11蓝牙设备配对与连接教程【步骤】
Win11怎么设置虚拟内存最佳大小_Windows11性能选项自定义分页文件
Win11怎么设置开机密码_Windows11账户登录选项PIN码
如何外贸网站设计-能留住客户提升用户体验!
Win11怎么关闭用户账户控制UAC_Windows11更改通知设置等级
Windows10怎么备份注册表_Windows10注册表备份步骤【教程】
Win10怎样安装Excel数据分析工具_Win10安装分析工具包步骤【教程】
Win10闹钟铃声怎么自定义 Win10闹钟自定义铃声教程【方法】
Win11怎么关闭小组件_Win11禁用任务栏天气与小组件方法【设置】
Win11怎么设置DNS服务器_Windows11修改网络适配器DNS优选
Win11怎么查看显卡显存_查询Win11显卡详细参数方法【步骤】
php文件怎么变mp4保存_php输出视频流保存为mp4操作【操作】
C++如何使用std::transform批量处理容器元素?(代码示例)
Win11怎么关闭内容自适应亮度_Windows11显示设置CABC关闭
Win10系统怎么查看网络连接状态_Windows10网络和共享中心
Win11怎么设置默认邮件客户端 Win11修改Mail应用关联【教程】
c# 如何用c#实现一个支持优先级的任务队列
Mac如何修改Hosts文件?(本地开发与屏蔽网站)
Win11怎样安装微信开发者工具_Win11安装开发者工具教程【步骤】
c++如何利用doxygen生成开发文档_c++ 代码注释规范与HTML文档导出【案例】
如何使用Golang处理网络超时错误_Golang请求超时异常处理方法
Mac如何开启夜览模式_Mac护眼模式设置与定时
Mac电脑进水了怎么办_MacBook进水后紧急处理方法【必看】
如何用::实现工具类方法调用_php静态工具类设计技巧【技巧】
Win10电脑C盘红了怎么清理_Windows10系统盘深度瘦身指南
Win11怎么关闭搜索历史 Win11清除搜索框最近记录【隐私】
Win11怎么更改计算机名_Windows11系统信息重命名设备教程
Win10怎么更改用户名 Win10修改账户名称操作教程
Win11如何更新显卡驱动 Win11检查和安装设备驱动程序【方法】
php8.4xdebug无法调试怎么办_php8.4xdebug配置问题解决【解答】
c# 在高并发下使用反射发射(Reflection.Emit)的性能
PHP 中如何在函数内持久化修改引用变量的指向
Mac如何解压zip和rar文件?(推荐免费工具)
Win11如何添加/删除输入法 Win11切换中英文输入法快捷键【设置】
如何使用Golang管理模块版本_Golanggo mod tidy与升级方法
mac怎么安装adb_MAC配置Android ADB开发环境【详解】
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
2026-01-01
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。