题目大意:求一个数组的中位数
题目链接:http://poj.org/problem?id=2388
数据量水,直接sort也能过。或者用算法导论第9章的方法,类似快排方法来找。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
#include <time.h>
#define MAXN 10001
int A[MAXN];
void exchange(int& x, int& y)
{
int tmp = x;
x = y;
y = tmp;
}
int r_partition(int p, int r)
{
int i = rand() % (r - p + 1) + p;
exchange(A[r], A[i]);
int x = A[r];
i = p - 1;
for (int j = p; j < r; j++)
{
if (A[j] <= x)
{
i++;
exchange(A[i], A[j]);
}
}
exchange(A[i + 1], A[r]);
return i + 1;
}
int r_select(int p, int r, int i)
{
if (p == r)
return A[p];
int q = r_partition(p, r);
int k = q - p + 1;
if (i == k)
return A[q];
else if (i < k)
return r_select(p, q - 1, i);
else
return r_select(q + 1, r, i - k);
}
int main()
{
int n;
srand((unsigned)time(NULL));
while (~scanf("%d", &n))
{
for (int i = 0; i < n; i++)
{
scanf("%d", &A[i]);
}
printf("%d\n", r_select(0, n - 1, (n + 1) / 2));
}
return 0;
}