用递归与分治的方法设计并实现寻找第k小元素算法(参见P122-123)。 注:随机生成包含若干元素的数组进行测试!c语言源代码及其运行截图
时间: 2024-09-27 21:06:50 浏览: 36
在计算机科学中,寻找数组中第K小的元素可以使用分治法和递归策略,一种常见的算法是“快速选择”(QuickSelect)。这是一种改进版的快速排序,其核心思想是基于一趟排序找到第K小的元素。
以下是C语言的一个简单版本的快速选择算法实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// Partition helper function
int partition(int arr[], int low, int high, int k) {
int pivot = arr[high]; // choose the last element as pivot
int i = (low - 1); // Index of smaller element
for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++;
// Swap arr[i] and arr[j]
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// Swap arr[i + 1] and arr[high] (or pivot)
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
// If pivot's correct position is k, return it.
if (i + 1 == k)
return arr[i + 1];
// If k is less than the pivot's position, recur for left subarray
else if (i + 1 > k)
return partition(arr, low, i, k);
// Else recur for right subarray
else
return partition(arr, i + 2, high, k);
}
// Function to find kth smallest element in array
int quickselect(int arr[], int low, int high, int k) {
if (low == high) // Base case: only one element
return arr[low];
int pivot_index = partition(arr, low, high, k);
// Return kth smallest element in the appropriate partition
return (pivot_index == k) ? arr[pivot_index] :
(pivot_index < k) ? quickselect(arr, pivot_index + 1, high, k) :
quickselect(arr, low, pivot_index - 1, k);
}
int main() {
srand(time(0));
const int size = 10;
int* arr = malloc(size * sizeof(int)); // Randomly generate array
for (int i = 0; i < size; i++)
arr[i] = rand() % 100; // Fill with random numbers between 0 and 99
int k;
printf("Enter k: ");
scanf("%d", &k);
int kth_smallest = quickselect(arr, 0, size - 1, k - 1); // Subtract 1 from k for zero-based indexing
printf("The kth smallest element is: %d\n", kth_smallest);
free(arr);
return 0;
}
```
为了生成测试用例的运行截图,你需要在实际环境中运行这个程序,并观察控制台输出的结果。由于这是一个文本环境,无法直接提供图片,你可以自行运行代码并在控制台查看结果。
阅读全文