# 排序算法性能分析项目

本项目使用 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. 编译项目
在项目根目录下，执行以下命令来编译所有源代码：
```bash
make
```
该命令会自动调用 `g++` 编译器，并将所有 `.cpp` 文件编译链接成一个名为 `sorting_experiment` 的可执行文件。

### 2. 运行实验
编译成功后，执行以下命令来运行完整的性能分析测试：
```bash
make run
```
你也可以直接运行生成的可执行文件：
```bash
./sorting_experiment
```
程序启动后，将开始对所有算法和所有预设规模进行测试，并将结果实时输出到控制台。

### 3. 清理生成文件
如果你想删除所有编译生成的目标文件 (`.o`) 和可执行文件，可以运行：
```bash
make clean
```

## 输出结果解读

程序的输出是一个性能指标表格，每一行代表一种算法在一个特定数据规模下的平均测试结果。

| 列名 | 中文说明 |
| :--- | :--- |
| **Algorithm** | 被测试的排序算法的名称。 |
| **Size** | 当前测试的数组大小（即数据规模 `n`）。 |
| **Avg Time (s)** | 多次重复测试下的平均运行时间，单位为秒。 |
| **Avg Comparisons**| 平均比较操作的次数。 |
| **Avg Moves** | 平均移动（赋值或交换）操作的次数。 |
| **Correct?** | 排序结果是否正确，"Yes" 代表正确无误。 |
