如何用C语言实现快速选择算法?
时间: 2024-12-25 15:28:36 浏览: 4
快速选择算法是一种类似于快速排序的查找算法,它用于找到数组中第k小的元素。相比于排序整个数组,快速选择只对部分数组进行操作,因此对于寻找特定排名的数据更高效。以下是简单的步骤:
1. **选择枢轴**:随机选择一个元素作为枢轴(pivot)。
2. **分区**:将数组分为三部分:小于枢轴的元素、等于枢轴的元素和大于枢轴的元素。这一步通常通过一趟分区操作完成。
3. **判断位置**:
- 如果枢轴的位置恰好是k,那么找到了第k小的元素,返回枢轴值。
- 如果枢轴位置小于k,则在大于枢轴的那一半数组中继续查找第k小的元素。
- 否则,在小于枢轴的那一半数组中查找第(k-pivot_index)小的元素,这里pivot_index是当前枢轴的位置。
4. **递归**:重复上述过程,直到找到目标位置。
C语言实现快速选择的关键在于`partition()`函数,该函数会划分数组并返回枢轴的新位置。这是一个简化版的C语言实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int partition(int arr[], int low, int high, int pivot_idx) {
int pivot = arr[pivot_idx];
swap(&arr[pivot_idx], &arr[high]);
int store_idx = low;
for (int i = low; i < high; i++) {
if (arr[i] < pivot) {
swap(&arr[store_idx], &arr[i]);
store_idx++;
}
}
swap(&arr[store_idx], &arr[high]);
return store_idx;
}
int quick_select(int arr[], int low, int high, int k) {
srand(time(0));
if (low == high) {
return arr[low];
}
int pivot_idx = rand() % (high - low + 1) + low;
pivot_idx = partition(arr, low, high, pivot_idx);
if (k == pivot_idx)
return arr[k];
else if (k < pivot_idx)
return quick_select(arr, low, pivot_idx - 1, k);
else
return quick_select(arr, pivot_idx + 1, high, k);
}
int main() {
int arr[] = {5, 3, 6, 2, 9, 7};
int n = sizeof(arr) / sizeof(arr[0]);
int k = 3;
int result = quick_select(arr, 0, n - 1, k - 1); // 函数中k需要减一对应数组索引
printf("The %dth smallest element is: %d\n", k, result);
return 0;
}
```
阅读全文