快速排序详解与优化实践
快速排序是 C 标准库中常用的高效排序算法。本文从基础 Hoare 分区法入手,详细解析其递归实现原理,并针对实际场景中的性能瓶颈提供多种优化方案,包括三数取中、小区间切换及非递归实现。
一、基础实现:Hoare 分区法
1. 核心思想
快速排序的核心在于选择一个基准值(key),将数组分为两部分:左边小于 key,右边大于 key。然后对左右区间递归执行相同操作,直到区间不可再分。
2. 实现逻辑
我们使用两个指针,一个从左向右找大数,一个从右向左找小数。当两指针相遇时,交换基准值与相遇点元素,完成一次分区。
具体步骤如下:
- 定 Key:通常选取第一个元素作为基准。
- 双指针移动:右指针先向左寻找比 key 小的值,左指针向右寻找比 key 大的值。
- 交换:找到后交换两指针指向的元素。
- 循环终止:当左右指针相遇时停止。
- 归位:将 key 与相遇点元素交换,此时 key 左侧均小于它,右侧均大于它。
3. 代码实现
void QuickSort1(int* a, int left, int right)
{
if (left >= right) // 区间只有一个或零个元素时结束
return;
int key = left; // 确定 key 的值,为第一个元素
int L = left;
int R = right; // 记录初始下标,防止后续修改丢失
while (left < right) // 当左右小人相遇时就停止循环
{
// 右小人向左走,直到找到比 key 小的值
while (left < right && a[right] >= a[key])
right--;
// 左小人向右走,直到找到比 key 大的值
while (left < right && a[left] <= a[key])
left++;
Swap(&a[left], &a[right]); // 交换大的值和小的值
}
Swap(&a[right], &a[key]); // 最后交换 key 和相遇点对应的值
key = right; // key 的下标也要改变
QuickSort1(a, L, key - 1); // 递归 key 的左区间
QuickSort1(a, key + 1, R); // 递归 key 的右区间
}


