编写快速排序算法c语言程序,要求至少实现两种不同的支点元选取方法
时间: 2024-11-03 12:24:09 浏览: 17
快速排序是一种高效的排序算法,其基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分继续进行排序,直到整个序列有序。这里我将简述如何用C语言编写快速排序的基本步骤,并提供两种常见的支点选择方法:
1. **随机选取支点**(Random Pivot Selection):
```c
#include <stdio.h>
#include <stdlib.h>
int partition(int arr[], int low, int high) {
int pivot = arr[high]; // 随机选取最后一个元素作为基准
int i = (low - 1); // 将i指向小于基准的位置
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
// 交换arr[i]和arr[j]
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// 将基准元素放在正确位置上
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1;
}
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1); // 对左半边递归排序
quickSort(arr, pi + 1, high); // 对右半边递归排序
}
}
// 示例
int main() {
int arr[] = {9, 7, 5, 11, 12, 2, 14, 3};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}
```
2. **三数取中法**(Median of Three Pivot Selection):
```c
// 这里省略了部分代码,仅展示关键部分
int median_of_three(int arr[], int low, int high) {
int first = low, second = low + 1, third = high;
while (second < third) {
if (arr[first] > arr[third]) {
// 交换第一个和第三个元素
[交换操作]
} else if (arr[second] > arr[third]) {
// 如果第二个大于第三个,则交换第二个和第三个元素
[交换操作]
} else {
// 第二个不大于第三个,直接移动指针
second++;
}
// 移动指针
[移动指针操作]
}
return second;
}
// 修改partition函数,使用三数取中法选取pivot
int partition(int arr[], int low, int high) {
int pivot = median_of_three(arr, low, high);
// 然后按照标准的快速排序分区过程进行...
}
```
以上两种选择方法都可以提高快速排序的性能,避免最坏情况的发生。运行上述代码前,记得处理数组边界和错误检查。
阅读全文