C 语言快速排序详解:从基础到非递归实现
算法思想
快速排序(Quick Sort)是冒泡排序的一种改进,也是目前应用最广泛的排序算法之一。其核心思想是分治法:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
简单来说,就是选定一个基准值(Key),将比它小的数放到左边,比它大的数放到右边,然后对左右区间重复上述步骤。
基础实现(Hoare 版本)
核心逻辑
- 确定基准:通常选取数组的第一个元素作为 Key。
- 双指针扫描:定义两个指针 L 和 R,L 从左向右找大于 Key 的数,R 从右向左找小于 Key 的数。
- 交换位置:当两指针都停下时,交换它们指向的元素。
- 相遇处理:当 L 和 R 相遇时,停止循环,将 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) { // 当左右小人相遇时就停止循环
while (left < right && a[right] >= a[key]) { // 右小人向左走,直到找到比 key 小的值
right--;
}
while (left < right && a[left] <= a[key]) { // 左小人向右走,直到找到比 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 的右区间
}


