POJ-2388 Who's in the Middle

来源:互联网 发布:淘宝直通车在哪里找图 编辑:程序博客网 时间:2024/04/30 06:16

题目大意:求一个数组的中位数
题目链接: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 10001int 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;}
0 0
原创粉丝点击