C++经典排序技巧总结

简介: 每种排序算法都有其适用场景,掌握这些排序技巧能让你在面对不同的排序需求时更加得心应手。实际编程中需权衡数据规模、排序算法的时间复杂度和稳定性来选用合适的排序算法。

C++作为一门高效的编程语言,其标准库提供了强大的排序功能,以下我们将探索一些C++中的经典排序技巧。

1. STL Sort函数

标准模板库(STL)中的 sort()函数是最常用的排序方法,它基于快速排序算法,但是会根据元素数量和数据分布适应性地采用插入排序或堆排序。

#include <algorithm>
#include <vector>

std::vector<int> nums = {4, 1, 3, 5, 2};
std::sort(nums.begin(), nums.end());
​

2. 自定义比较函数

可以自定义比较函数来实现特定的排序规则,此比较函数必须是一个返回bool类型的二元谓词。

#include <algorithm>
#include <vector>

bool compare(int a, int b) {
    return a > b; // 降序排列
}

std::vector<int> nums = {4, 1, 3, 5, 2};
std::sort(nums.begin(), nums.end(), compare);
​

3. 使用Lambda表达式

C++11引入的Lambda表达式可以让你在调用 sort()时直接写内联比较逻辑,使代码更加紧凑。

#include <algorithm>
#include <vector>

std::vector<int> nums = {4, 1, 3, 5, 2};
std::sort(nums.begin(), nums.end(), [](int a, int b) {
    return a < b; // 升序排列
});
​

4. 部分排序

STL中的 partial_sort可以对集合的一部分元素进行排序,其余元素未必保证有序。

#include <algorithm>
#include <vector>

std::vector<int> nums = {4, 1, 3, 5, 2};
std::partial_sort(nums.begin(), nums.begin() + 3, nums.end());
​

5. 稳定排序

stable_sort类似于 sort,区别在于它保持相等元素的相对顺序。这适用于保持多个字段的顺序排序。

#include <algorithm>
#include <vector>

std::vector<std::pair<int, char>> pairs = {
  {1, 'A'}, {2, 'B'}, {1, 'B'}, {2, 'A'}};
std::stable_sort(pairs.begin(), pairs.end());
​

6. nth_element的使用

当你需要找到经过排序后会位于第n个位置的元素,而不需要对整个集合排序时,可以使用 nth_element

#include <algorithm>
#include <vector>

std::vector<int> nums = {4, 1, 3, 5, 2};
std::nth_element(nums.begin(), nums.begin() + 2, nums.end());
​

7. 堆排序

使用STL中的 make_heap(), push_heap(), pop_heap()可以实现堆排序,适用于动态数据集合的高效排序。

#include <algorithm>
#include <vector>

std::vector<int> nums = {4, 1, 3, 5, 2};
std::make_heap(nums.begin(), nums.end());
std::sort_heap(nums.begin(), nums.end());
​

8. 插入排序

对于小型数据集或几乎排序好的数据集,插入排序是一个很好的选择,因为它有很低的开销。

#include <vector>

std::vector<int> nums = {4, 1, 3, 5, 2};
for (int i = 1; i < nums.size(); ++i) {
    int key = nums[i];
    int j = i - 1;

    while (j >= 0 && nums[j] > key) {
        nums[j + 1] = nums[j];
        j = j - 1;
    }
    nums[j + 1] = key;
}
​

9. 快速排序

自己实现快速排序算法,可以更好地理解其分而治之的原理。

#include <vector>

int partition(std::vector<int>& nums, int low, int high) {
    int pivot = nums[high];
    int i = (low - 1);

    for (int j = low; j <= high - 1; j++) {
        if (nums[j] < pivot) {
            i++;
            std::swap(nums[i], nums[j]);
        }
    }
    std::swap(nums[i + 1], nums[high]);
    return (i + 1);
}

void quickSort(std::vector<int>& nums, int low, int high) {
    if (low < high) {
        int pi = partition(nums, low, high);
        quickSort(nums, low, pi - 1);
        quickSort(nums, pi + 1, high);
    }
}
​

结语

每种排序算法都有其适用场景,掌握这些排序技巧能让你在面对不同的排序需求时更加得心应手。实际编程中需权衡数据规模、排序算法的时间复杂度和稳定性来选用合适的排序算法。

目录
相关文章
|
5月前
|
程序员 编译器 C++
【实战指南】C++ lambda表达式使用总结
Lambda表达式是C++11引入的特性,简洁灵活,可作为匿名函数使用,支持捕获变量,提升代码可读性与开发效率。本文详解其基本用法与捕获机制。
182 43
|
5月前
|
网络协议 API
区分TCP/IP、HTTP、Socket三者的差异
HTTP关注于应用层的协议规范,而Socket关注于为应用程序提供编程中的网络功能,这些功能本身是建立在底层的TCP/IP协议之上;HTTP是更高层次的抽象,定义了如何包装数据,而TCP/IP定义了如何传送数据,Socket则是两者之间在程序中的桥梁,负责实现细节。在实际应用中,通常HTTP通信也是通过Socket来完成,因为HTTP仅是具体内容的封装形式,而Socket则是传送方式的实现形式。
485 16
|
6月前
|
人工智能 监控 中间件
深入解析|Cursor编程实践经验分享
本文是近两个月的实践总结,结合在实际工作中的实践聊一聊Cursor的表现。记录在该过程中遇到的问题以及一些解法。问题概览(for 服务端): 不如我写的快?写的不符合预期? Cursor能完成哪些需求?这个需求可以用Cursor,那个需求不能用Cursor? 历史代码分析浅显,不够深入理解? 技术方案设计做的不够好,细节缺失,生成代码的可用性不够满意?
1290 10
深入解析|Cursor编程实践经验分享
|
5月前
|
SQL 缓存 前端开发
如何开发进销存系统中的基础数据板块?(附架构图+流程图+代码参考)
进销存系统是企业管理采购、销售与库存的核心工具,能有效提升运营效率。其中,“基础数据板块”作为系统基石,决定了后续业务的准确性与扩展性。本文详解产品与仓库模块的设计实现,涵盖功能概述、表结构设计、前后端代码示例及数据流架构,助力企业构建高效稳定的数字化管理体系。
|
5月前
|
安全 芯片 Windows
U盘插上后显示为空?其实数据没丢,可以这样恢复
U盘变空并不等于数据丢失!本文详解U盘插入提示“格式化”、显示为空等常见问题的原因,教你如何在不格式化的前提下恢复数据,修复异常,并避免再次发生。内容涵盖逻辑错误识别、恢复软件使用步骤及U盘是否还能继续使用的判断方法,助你轻松应对U盘故障。
|
5月前
|
数据可视化 Linux C#
Visual Studio 高手进阶的 10 个效率与洞察力利器
本文深入解析10个Visual Studio中常被忽视的高级功能与技巧,专为资深开发者设计。内容涵盖性能剖析、调试增强、内存布局查看、自定义调试可视化、条件断点、并行调试、正则搜索、构建管理、热重载突破及WSL2集成等,助你挖掘VS潜能,显著提升开发效率与问题诊断能力,成为真正的VS忍者。
158 0
|
5月前
|
运维 监控 算法
小白也能做OS运维:阿里云操作系统控制台助你轻松解决三大运维难题
阿里云推出了一站式运维管理平台操作系统控制台,提出了异常告警和诊断联动的一套解决方案,对异常指标进行智能检测
|
5月前
|
人工智能 缓存 数据可视化
手把手玩转本地大模型:Ollama+DeepSeek+Dify 零门槛全流程指南
本文提供从零搭建本地AI工作站的完整指南,详解本地化部署大模型的核心优势(数据隐私/离线可用/成本可控),涵盖Ollama安装、DeepSeek-Coder模型部署、Dify可视化操作及API调用实战,助你打造安全高效的私有AI开发环境。
|
5月前
|
人工智能 运维 数据可视化
分享小伙伴私信推荐的5款小工具
本文推荐了五款实用的免费工具,涵盖任务栏优化、代码编辑、在线AI工具、云端协作及思维可视化。包括TranslucentTB、Sublime Text、3171.CN、石墨文档与知犀思维导图,适用于各类办公与学习场景,提升效率与协作体验。
150 0