c++中如何对数组进行排序_c++数组排序算法汇总


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::arraystd::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(),支持动态大小
  • 如果用 C++20,还可直接 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; // 按年龄升序
});
  • lambda 参数加 const Person& 避免拷贝开销
  • 比较逻辑必须满足严格弱序:反对称、传递、不可比性可传递
  • 若需多级排序(先按 age,age 相同时按 name),写成 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

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.