编写寻找第k小程序,给出两个不同测试样例并测试用C语言
时间: 2024-10-09 10:14:41 浏览: 20
C语言程序设计课程设计报告_模板样例.doc
编写一个查找第k小的元素的程序通常涉及排序算法,因为我们需要找到数组中第k个最小的数。这里提供一个简单的示例,使用快速选择算法(一种改进的二分查找),它在平均情况下时间复杂度为O(n)。以下是使用C语言实现的一个基本版本:
```c
#include <stdio.h>
#include <stdlib.h>
int partition(int arr[], int low, int high) {
int pivot = arr[high]; // 选取最后一个元素作为基准
int i = (low - 1); // 小于基准的元素索引
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;
}
// 在未排序部分中查找第k小的元素
int quickSelect(int arr[], int low, int high, int k) {
if (low == high) {
return arr[low];
}
int pivotIndex = partition(arr, low, high);
// 如果k等于枢轴位置,直接返回
if (k == pivotIndex)
return arr[k];
else if (k < pivotIndex)
return quickSelect(arr, low, pivotIndex - 1, k);
else
return quickSelect(arr, pivotIndex + 1, high, k);
}
// 测试样例1
void test_case_1() {
int arr[] = {5, 3, 6, 2, 10, 4};
int n = sizeof(arr) / sizeof(arr[0]);
int k = 3;
printf("Element at position %d is: %d\n", k, quickSelect(arr, 0, n - 1, k));
}
// 测试样例2
void test_case_2() {
int arr[] = {8, 2, 23, 7, 10, 24, 1, 18};
int n = sizeof(arr) / sizeof(arr[0]);
int k = 5;
printf("Element at position %d is: %d\n", k, quickSelect(arr, 0, n - 1, k));
}
int main() {
test_case_1();
test_case_2();
return 0;
}
```
在这个程序中,`quickSelect`函数负责查找第k小的元素。`test_case_1`和`test_case_2`展示了如何调用这个函数处理不同的输入数组和k值。
阅读全文