三路快速排序 思路、C 代码、以及解释:
三路快速排序是一种改进的快速排序算法,旨在解决在含有大量重复元素的数组中性能下降的问题。它在原始的快速排序算法的基础上,将数组分为三部分,分别是小于、等于和大于基准元素的部分。这样,在含有大量重复元素的情况下,可以减少递归的深度,从而提高性能。
以下是三路快速排序的思路、C代码以及解释:
#include <stdio.h>
// 交换数组中两个元素的值
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 三路快速排序的核心函数
void quickSort(int arr[], int low, int high) {
if (low >= high) return;
int pivot = arr[low]; // 选择第一个元素作为基准
int lt = low; // lt指针指向小于pivot的最后一个元素的位置
int gt = high; // gt指针指向大于pivot的第一个元素的位置
int i = low + 1; // i指针用于遍历数组
while (i <= gt) {
if (arr[i] < pivot) {
swap(&arr[i], &arr[lt+1]); // 将arr[i]交换到小于pivot的部分
i++;
lt++;
} else if (arr[i] > pivot) {
swap(&arr[i], &arr[gt]); // 将arr[i]交换到大于pivot的部分
gt--;
} else {
i++; // 等于pivot的部分,i继续向前移动
}
}
swap(&arr[low], &arr[lt]); // 将pivot放置在正确的位置
// 递归对小于pivot和大于pivot的部分进行排序
quickSort(arr, low, lt - 1);
quickSort(arr, gt + 1, high);
}
// 测试函数
int main() {
int arr[] = {3, 6, 2, 8, 5, 2, 8, 3, 5, 1};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Original array: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
quickSort(arr, 0, n - 1);
printf("Sorted array: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
这段代码实现了三路快速排序算法。在quickSort
函数中,首先选择数组的第一个元素作为基准,然后通过lt
、gt
指针将数组分为小于、等于和大于基准的三部分。然后递归地对小于和大于基准的两部分进行排序。在遍历数组时,通过不断地交换元素的位置,将数组分成三个部分,以实现三路快速排序的目的。
三路快排时间复杂度和空间复杂度:
三路快速排序的时间复杂度和空间复杂度如下:
时间复杂度:
- 最佳情况下(数组中的元素均匀分布):O(n log n)
- 最坏情况下(数组中的元素全部相同):O(n^2)
- 平均情况下:O(n log n)
空间复杂度:
- 由于三路快速排序是原地排序算法,只需要常数级别的额外空间来存储一些辅助变量,因此空间复杂度为 O(1)。