C 语言快速排序详解:从基础到非递归实现
快速排序是 C 语言标准库中采用的一种高效排序算法。本文将深入剖析其核心原理,从基础的 Hoare 分区法入手,逐步讲解三数取中、小区间优化等进阶技巧,最后探讨如何利用栈结构实现非递归版本。
一、快速排序基础
1. 算法思想
快速排序的核心在于'分治'。选取一个基准值(Key),通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
2. 实现思路
我们通常使用两个指针(L 和 R)分别从数组两端向中间扫描。R 指针先向左寻找小于 Key 的元素,L 指针再向右寻找大于 Key 的元素,找到后交换两者位置。重复此过程直到两指针相遇,最后将 Key 与相遇点交换。此时 Key 左侧均小于它,右侧均大于它,完成一次划分。
3. 代码实现
void QuickSort1(int* a, int left, int right) {
if (left >= right)
return;
int key = left;
int L = left, R = right;
while (left < right) {
while (left < right && a[R] >= a[key]) R--;
while (left < right && a[L] <= a[key]) L++;
Swap(&a[L], &a[R]);
}
Swap(&a[R], &a[key]);
QuickSort1(a, L, key - 1);
QuickSort1(a, key + 1, R);
}
二、性能优化
1. 三数取中法
固定选取首元素作为 Key 在最坏情况下(如已排序数组)会导致时间复杂度退化为 O(N^2)。引入三数取中法,比较首、尾、中间三个元素,将中位数作为 Key,能有效避免极端情况。
int FindKey(int* a, int left, int right) {
int mid = (left + right) / 2;
if (a[left] > a[right]) {
if (a[right] > a[mid]) return right;
else if (a[mid] > a[left]) return left;
else return mid;
} {
(a[left] > a[mid]) left;
(a[mid] > a[right]) right;
mid;
}
}


