C语言用分治法寻找第k小的值,输入有多行,第一行是三个整数n、m和k,表示后面有n行,每一行都有m个整数,输出有多行,对应输入中从第二行开始,每一行m个整数中的第k小的值。
时间: 2024-02-22 20:59:48 浏览: 72
好的,以下是基于分治法的C语言实现,用于寻找第k小的值:
```c
#include <stdio.h>
int quickSelect(int arr[], int left, int right, int k) {
if (left == right) {
return arr[left];
}
int pivotIndex = (left + right) / 2;
pivotIndex = partition(arr, left, right, pivotIndex);
if (k == pivotIndex) {
return arr[k];
} else if (k < pivotIndex) {
return quickSelect(arr, left, pivotIndex - 1, k);
} else {
return quickSelect(arr, pivotIndex + 1, right, k);
}
}
int partition(int arr[], int left, int right, int pivotIndex) {
int pivotValue = arr[pivotIndex];
swap(arr, pivotIndex, right);
int storeIndex = left;
for (int i = left; i <= right - 1; i++) {
if (arr[i] < pivotValue) {
swap(arr, i, storeIndex);
storeIndex++;
}
}
swap(arr, storeIndex, right);
return storeIndex;
}
void swap(int arr[], int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
int main() {
int n, m, k;
scanf("%d%d%d", &n, &m, &k);
for (int i = 0; i < n; i++) {
int arr[m];
for (int j = 0; j < m; j++) {
scanf("%d", &arr[j]);
}
printf("%d ", quickSelect(arr, 0, m - 1, k - 1));
}
return 0;
}
```
这个算法的时间复杂度是O(nmlogm),其中n表示行数,m表示每行的元素个数。
阅读全文