快速排序是一种高效的排序算法,它采用分治法的思想来对数组进行排序。以下是快速排序的基本步骤和原理:
选择基准
从数组中选择一个元素作为基准(pivot)。选择基准的方法有多种,常见的选择有第一个元素、最后一个元素或随机选择。
分区
遍历数组,使得所有比基准小的元素都移到基准的左侧,所有比基准大的元素都移到基准的右侧。这个过程称为分区(Partition)。经过这一步骤后,基准元素的位置就固定下来。
递归
对基准左侧和右侧的子数组分别进行快速排序。递归的终止条件是子数组中只有一个元素,因为单个元素已经是有序的。
代码示例
```c
include
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int Partition(int arr[], int left, int right) {
int pivot = arr[left]; // 将第一个元素作为基准数
int i = left, j = right;
while (i < j) {
// 从右往左找到第一个小于基准数的元素
while (i < j && arr[j] >= pivot) {
j--;
}
if (i < j) {
swap(&arr[i], &arr[j]);
i++;
}
// 从左往右找到第一个大于基准数的元素
while (i < j && arr[i] <= pivot) {
i++;
}
if (i < j) {
swap(&arr[i], &arr[j]);
}
}
swap(&arr[left], &arr[i]); // 将基准数放回正确的位置
return i;
}
void quickSort(int arr[], int left, int right) {
if (left < right) {
int pi = Partition(arr, left, right);
quickSort(arr, left, pi - 1); // 递归排序基准左侧的子数组
quickSort(arr, pi + 1, right); // 递归排序基准右侧的子数组
}
}
int main() {
int arr[] = {10, 7, 8, 9, 1, 5};
int n = sizeof(arr) / sizeof(arr);
quickSort(arr, 0, n - 1);
printf("Sorted array: \n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
算法特点
原地排序:快速排序是原地排序算法,不需要额外的存储空间。
时间复杂度:平均情况下,时间复杂度为O(n log n),但在最坏情况下(如已经排序的数组),时间复杂度可能退化到O(n^2)。
空间复杂度:由于递归调用,空间复杂度为O(log n)。
稳定性:快速排序是不稳定的排序算法。
通过上述步骤和代码示例,你可以实现一个快速排序程序,并对数组进行排序。