C 语言快速排序详解与多种优化变式
算法思想
快速排序(Quick Sort)是 C 语言标准库中常用的高效排序算法。其核心思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
基本流程
- 选择基准值(Key):通常选取数组的第一个元素作为基准。
- 分区操作:通过两个指针分别从左右两端向中间扫描,将小于基准值的放左边,大于基准值的放右边。
- 交换基准值:当两指针相遇时,将基准值交换到中间位置。
- 递归处理:对基准值左右两侧的子区间重复上述步骤,直到区间长度为 1。
一、快速排序初阶实现
实现思路
我们使用 Hoare 版本的双指针法来实现。定义 left 和 right 两个指针,key 指向起始位置。
- 右指针向左移动,找到第一个小于
key的值停下。 - 左指针向右移动,找到第一个大于
key的值停下。 - 交换这两个值。
- 重复直到两指针相遇,最后将
key与相遇点交换。
代码示例
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);
}


