C/C++快速排序算法:从分区逻辑到递归实现的完整解析
快速排序是C/C++中最常用的高效排序算法之一。其核心思想是通过一个分区操作将数组分为小于和大于基准值的两部分,然后递归地对这两部分进行排序。本文将详细讲解分区函数的实现细节以及递归调用的完整流程,提供可直接使用的C++代码示例。
快速排序的核心逻辑
快速排序(Quick Sort)的基本策略是采用分治法。具体过程如下:
- 选择基准(Pivot):从当前处理的子序列中选取一个元素作为基准值。
- 分区(Partition):重新排列序列,使得所有比基准值小的元素位于基准之前,比基准值大的元素位于基准之后。此时,基准值处于其最终排序后的正确位置。
- 递归排序:对基准左侧和右侧的子序列分别递归执行上述过程,直到子序列长度为1或0,排序结束。
第1步:实现分区函数
分区是快速排序最关键的步骤。以下是一个经典的基于双指针思想的分区实现。该函数选择子数组的第一个元素作为基准,并通过遍历移动较小的元素到左侧,最后将基准放置到正确位置。
// 交换辅助函数
void swap(int* a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
// 分区函数
// 参数说明:
// a: 待排序数组指针
// left: 子数组起始索引
// right: 子数组结束索引
int partition(int* a, int left, int right) {
// 选择最左边的元素作为基准
int pivot = left;
// index记录“小于基准值”区域的右边界下一位
int index = left + 1;
// 遍历除基准外的所有元素
for (int i = index; i <= right; i++) {
// 如果当前元素小于基准值,则将其交换到index位置,并扩大左侧小元素区域
if (a[i] < a[pivot]) {
swap(a, i, index);
index++;
}
}
// 将基准值交换到它应该在的位置(即index-1处)
// 因为index指向的是第一个大于等于基准值的位置,所以index-1是最后一个小于基准值的位置
swap(a, pivot, index - 1);
// 返回基准值的最终索引
return index - 1;
}
操作原理解析:在循环结束后,`index` 指向的是第一个不小于 `a[pivot]` 的元素。因此,`index - 1` 就是所有小于基准值的元素的最后一个位置,也是基准值应该安放的正确位置。通过 `swap(a, pivot, index - 1)` 完成基准值的定位。
第2步:实现递归排序主函数
在获取基准值的正确位置后,需要对该位置的左边和右边分别进行递归排序。当子数组的左边界大于或等于右边界时,说明子数组长度不超过1,无需排序。
// 快速排序主函数
// 参数说明:
// a: 待排序数组指针
// left: 当前处理子数组的起始索引
// right: 当前处理子数组的结束索引
void quick_sort(int* a, int left, int right) {
// 递归终止条件:子数组只有一个或零个元素
if (left < right) {
// 1. 进行分区,获取基准值的最终索引
int pivot_index = partition(a, left, right);
// 2. 递归排序基准值左侧的部分
quick_sort(a, left, pivot_index);
// 3. 递归排序基准值右侧的部分
// 注意:pivot_index处的元素已经排好序,右侧从 pivot_index + 1 开始
quick_sort(a, pivot_index + 1, right);
}
}
调用逻辑说明:
quick_sort(a, left, pivot_index):对基准值左边的子数组进行排序。由于基准值已经在正确位置,此处传入的右边界为 `pivot_index`,但因为在分区函数中基准值已就位,实际递归处理的是小于基准的区域。quick_sort(a, pivot_index + 1, right):对基准值右边的子数组进行排序,起始索引为 `pivot_index + 1`。
使用注意事项
1. 数组越界检查:在实际工程中,调用 `quick_sort` 前需确保数组非空且索引合法。 2. 时间复杂度:最好情况 $O(n \log n)$,平均情况 $O(n \log n)$,最坏情况(如数组已有序且总是选第一个元素为基准)为 $O(n^2)$。可通过随机选择基准或三数取中法优化最坏情况。 3. 稳定性:快速排序是不稳定排序算法,相等元素的相对位置可能会改变。
总结
快速排序通过分区和递归两个核心步骤实现了高效排序。掌握分区函数中基准的选择、元素的迁移以及边界值的计算逻辑,是理解并手写快排的关键。上述C++代码提供了完整的实现范例,可直接用于学习或集成到项目中。
以上就是C/C++快速排序算法的详细内容,更多关于C/C++基础算法的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













