4.0 KiB
4.0 KiB
排序算法性能分析项目
本项目使用 C++ 实现并深入分析了多种经典排序算法的性能。项目提供了一个自动化测试框架,能够在不同规模的随机生成数据集上对每种算法进行测试,并精确测量其执行时间、比较次数和移动次数,以供量化分析。
项目内容与实现方式
1. 模块化的算法实现
为了保证代码的清晰度和可扩展性,每一种排序算法都作为独立的模块在各自的 .cpp 文件中实现。所有算法的函数声明都统一在 algorithm.h 头文件中进行管理。
这种结构使得添加新的算法或修改现有算法变得非常简单。
2. 精确的性能指标统计
为了超越单纯的运行时间测量,本项目在每种排序算法的实现内部进行了“插桩”,以统计两个核心的性能指标:
- 比较次数 (Comparisons):算法执行过程中元素之间进行比较的总次数。
- 移动次数 (Moves):算法执行过程中数据的赋值、交换等移动操作的总次数。一个
std::swap操作计为3次移动。
这些数据为理论复杂度分析提供了有力的实验验证。
3. 自动化的测试与分析框架
项目核心是一个位于 main.cpp 的自动化测试框架,其主要功能包括:
- 多算法支持:能够自动运行所有已实现的排序算法。
- 多规模测试:支持在一系列预设的数据规模(例如 100, 1000, ..., 500,000)上进行测试。
- 结果可靠性:通过对每个规模进行多次重复实验并计算平均值,有效消除了单次运行的随机性误差。
- 正确性校验:在每次排序任务完成后,自动检查数组是否真正有序,确保了算法实现的正确性。
- 格式化输出:将所有测试结果以清晰的表格形式输出到控制台,方便用户阅读和分析。
已实现的排序算法
本项目共实现了以下算法:
基础排序算法
- 插入排序 (Insert Sort)
- 冒泡排序 (Bubble Sort)
- 希尔排序 (Shell Sort)
- 归并排序 (Merge Sort)
快速排序 (Quick Sort) 变体
- 标准快速排序:选择最后一个元素作为基准点。
- 三数取中优化快速排序 (QuickSortOptimized):通过“三数取中”策略选择基准点,以提高算法在特殊数据(如部分有序)下的稳定性。
- 三路快速排序 (QuickSort3Way):特别适用于处理含有大量重复元素的数组。
- 双基准快速排序 (Dual-Pivot Quick Sort):使用两个基准点将数组划分为三部分,理论上能减少比较次数,在现代处理器上性能优异。
如何编译与运行
项目提供了一个 Makefile 文件,极大地简化了编译、运行和清理流程。
1. 编译项目
在项目根目录下,执行以下命令来编译所有源代码:
make
该命令会自动调用 g++ 编译器,并将所有 .cpp 文件编译链接成一个名为 sorting_experiment 的可执行文件。
2. 运行实验
编译成功后,执行以下命令来运行完整的性能分析测试:
make run
你也可以直接运行生成的可执行文件:
./sorting_experiment
程序启动后,将开始对所有算法和所有预设规模进行测试,并将结果实时输出到控制台。
3. 清理生成文件
如果你想删除所有编译生成的目标文件 (.o) 和可执行文件,可以运行:
make clean
输出结果解读
程序的输出是一个性能指标表格,每一行代表一种算法在一个特定数据规模下的平均测试结果。
| 列名 | 中文说明 |
|---|---|
| Algorithm | 被测试的排序算法的名称。 |
| Size | 当前测试的数组大小(即数据规模 n)。 |
| Avg Time (s) | 多次重复测试下的平均运行时间,单位为秒。 |
| Avg Comparisons | 平均比较操作的次数。 |
| Avg Moves | 平均移动(赋值或交换)操作的次数。 |
| Correct? | 排序结果是否正确,"Yes" 代表正确无误。 |