Files
algo2025/sort_closet/code-sorting/README-zh.md
2025-12-18 16:00:22 +08:00

4.0 KiB
Raw Blame History

排序算法性能分析项目

本项目使用 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" 代表正确无误。