(1) FJ正在调查他的牛群,寻找最普通的奶牛。他想知道这头“中位数”奶牛产奶量:一半的奶牛产奶的量与中位数相同或更多;一半给予多少。给定奇数头奶牛N(1<=N<10000)和它们的产奶量(1..100000),找出牛奶的中位数,使至少一半的奶牛产奶量相同或更多,至少一半产奶量相等或更少。c语言实现并给出时间复杂度
时间: 2023-06-16 12:07:56 浏览: 241
20200314 jzoj c组 探索的奶牛(search)
这道题可以使用快速选择算法来解决,时间复杂度为O(n)。
具体思路如下:
1. 选择一个数作为枢轴(可以随机选择)。
2. 将小于等于枢轴的数放在左边,大于枢轴的数放在右边。
3. 如果中位数的下标为p,则枢轴的下标为q,比较p和q的大小关系。
4. 如果p=q,则枢轴就是中位数;如果p<q,则在右边的数中继续选择枢轴;如果p>q,则在左边的数中继续选择枢轴。
5. 重复以上步骤,直到找到中位数为止。
下面是具体的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int get_median(int *a, int n) {
int p = n / 2, l = 0, r = n - 1;
while (l < r) {
int q = rand() % (r - l + 1) + l;
int pivot = a[q], i = l - 1, j = r + 1;
while (i < j) {
do i++; while (a[i] < pivot);
do j--; while (a[j] > pivot);
if (i < j) {
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
int k = j - l + 1;
if (k == p) return pivot;
else if (p < k) r = j;
else {
p -= k;
l = j + 1;
}
}
return a[l];
}
int main() {
int n, a[10000];
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int median = get_median(a, n);
printf("%d\n", median);
return 0;
}
```
时间复杂度为O(nlogn),因为使用了快速排序。
阅读全文