快速排序(QuickSort)是一种高效的排序算法,采用“分治法”策略。
快速排序步骤:
- 选择基准(Pivot):从数组中选择一个元素作为基准。
- 分区(Partition):将数组重排,使得基准元素左侧的所有元素都小于基准元素,右侧的所有元素都大于等于基准元素。
- 递归排序:对基准元素左右两边的子数组递归应用快速排序。
简易代码描述:
// 分区函数,用于将数组分区,并返回基准元素的最终位置
void partition(int a[], int s, int t, int &k) {
int i, j, x;
x = a[s]; // 选择基准元素,通常选择当前区间的第一个元素
i = s; // 初始化左指针
j = t; // 初始化右指针
// 进行分区
do {
// 从右侧向左移动,寻找第一个小于基准元素的元素
while ((i < j) && a[j] >= x)
j--;
if (i < j)
a[i++] = a[j]; // 将找到的元素移动到左侧
// 从左侧向右移动,寻找第一个大于等于基准元素的元素
while ((i < j) && a[i] < x)
i++;
if (i < j)
a[j--] = a[i]; // 将找到的元素移动到右侧
} while (i < j); // 继续直到左指针和右指针相遇
a[i] = x; // 将基准元素放置在正确的位置
k = i; // 返回基准元素的位置
}
// 快速排序函数
void quickSort(int a[], int s, int t) {
if (s < t) { // 如果数组区间有效
int k;
partition(a, s, t, k); // 分区,并获取基准元素的位置
quickSort(a, s, k - 1); // 递归排序基准元素左侧的子数组
quickSort(a, k + 1, t); // 递归排序基准元素右侧的子数组
}
}
代码分析:
函数 partition:
实现了快速排序算法中的划分步骤。其作用是将数组 a
从下标 s
到下标 t
的部分进行划分,使得小于 x
的元素在左边,大于或等于 x
的元素在右边,并返回最终 x
的位置。具体过程如下:
- 选择数组的第一个元素
a[s]
作为基准元素x
。 - 设置两个指针
i
和j
,分别指向划分区间的起始位置s
和结束位置t
。 - 通过循环将大于等于
x
的元素移到右边,小于x
的元素移到左边。 - 当
i
和j
交错时,将基准元素x
放到最终位置i
,并将k
设置为i
,即基准元素的新位置。
函数的核心是调整 i
和 j
指针,直到它们相遇,从而完成划分操作。
函数quickSort
:递归地对基准元素左右两边的子数组进行排序。
时间复杂度:
快速排序的平均时间复杂度为 (O(n \log n)),最坏情况下为 (O(n^2)),但在实践中通常表现良好。