C++ 模板实现快速排序算法
导言
快速排序是一种高效的分治排序算法,平均时间复杂度为 O (n log n)。使用 C++ 模板实现快速排序可以使其适用于各种数据类型,配合比较器还能灵活调整排序规则。
一、快速排序算法原理
快速排序的核心思想是:
- 选择一个元素作为 "基准"(pivot)
- 将数组分区,所有比基准值小的元素移到基准前面,比基准值大的元素移到基准后面
- 递归地对前后两个子数组进行排序
这种分治策略使快速排序成为实际应用中最快的排序算法之一。
二、模板类实现
下面是完整的MyQsort
模板类实现,支持任意可比较的数据类型和自定义比较规则:
1 | #include <vector> |
三、使用示例
下面展示如何使用MyQsort
类对不同数据类型进行排序,包括默认排序和自定义比较器:
1 | #include "my_qsort.h" |
四、代码解析
4.1 模板参数说明
typename T
:表示要排序的数据类型,可以是基本类型(int、double 等)或自定义类型typename Compare = std::less
:比较器类型,默认使用std::less
实现升序排序
4.2 核心函数解析
- partition 函数:
- 选择最右侧元素作为基准 (pivot)
- 将所有小于基准的元素移到左侧,大于基准的元素移到右侧
- 返回基准元素的最终位置,用于递归划分
- quick 函数:
- 递归实现快速排序
- 对分区后的左右子数组分别进行排序
- 构造函数:
- 接收原始数组和大小
- 使用 vector 存储元素,方便管理和访问
五、编译与运行
运行结果:
1 | === 整数排序测试 === |
六、性能分析
- 时间复杂度:
- 平均情况:O (n log n)
- 最坏情况:O (n²)(可通过合理选择基准元素优化)
- 最好情况:O (n log n)
- 空间复杂度:O (log n) ~ O (n),主要来自递归调用栈
- 稳定性:本实现是非稳定排序,相等元素的相对位置可能改变
七、优化建议
- 基准元素选择:可以使用三数取中法(首、中、尾三个元素的中值)作为基准,避免最坏情况
- 小规模数组优化:对小于一定阈值(如 10-20 个元素)的子数组使用插入排序,提高实际运行效率
- 尾递归优化:将其中一个递归调用改为循环,减少栈空间使用
- 处理重复元素:使用三路快排(将数组分为小于、等于、大于基准三部分),优化含大量重复元素的数组排序
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.