快速排序思想
快速排序的核心在于分治策略,简单来说就是'分而治之'。它通过三步实现高效排序:
- 选基准:从待排序数组中选择一个元素作为「基准值」(pivot)。
- 分区操作:遍历数组,将小于基准值的元素放到左侧,大于基准值的元素放到右侧。这一步结束后,基准值会被放到最终排序的正确位置。
- 递归排序子区间:对基准值左右两侧的子数组,重复执行上述步骤,直到子数组长度为 0 或 1。
这种'拆分为小问题→独立解决→自然合并'的思路,是分治思想的典型体现。其高效性源于「分区」这一步:一次遍历就将大问题拆分成了两个规模更小的子问题,且无需额外的合并操作。
Hoare 版本
Hoare 版本是经典的原地分区实现,由算法发明者 Tony Hoare 提出,核心是双指针相向遍历。
针对升序排序,选取区间首元素作为基准值 key,右指针从右向左寻找首个小于 key 的元素,左指针再从左向右寻找首个大于 key 的元素,交换两指针指向的元素并重复此过程,直到两指针相遇。最后将基准值与相遇位置的元素交换,即可完成分区。

特点:原地分区、无额外空间开销,但需遵循「右指针先行」规则,否则会导致基准归位错误。

代码实现
void QuickSort1(int* a, int left, int right) {
if (left >= right) return;
int begin = left;
int end = right;
int keyi = left;
while (begin < end) {
while (begin < end && a[end] >= a[keyi]) end--;
while (begin < end && a[begin] <= a[keyi]) begin++;
swap(&a[begin], &a[end]);
}
swap(&a[keyi], &a[begin]);
keyi = begin;
QuickSort1(a, left, keyi - 1);
QuickSort1(a, keyi + 1, right);
}





