题目1157:中位数
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1526
解决:910
-
题目描述:
-
中位数定义:一组数据按从小到大的顺序依次排列,处在中间位置的一个数(或最中间两个数据的平均数).
给出一组无序整数,求出中位数,如果求最中间两个数的平均数,向下取整即可(不需要使用浮点数)
-
输入:
-
该程序包含多组测试数据,每一组测试数据的第一行为N,代表该组测试数据包含的数据个数,1<=N<=10000.
接着N行为N个数据的输入,N=0时结束输入
-
输出:
-
输出中位数,每一组测试数据输出一行
-
样例输入:
-
4 10 30 20 40 3 40 30 50 4 1 2 3 4 0
-
样例输出:
-
25 40 2
-
来源:
- 2011年北京大学计算机研究生机试真题
-
#include<stdio.h> #include<stdlib.h> int n,a[10005]; int find(int qian,int hou,int k) { int i=qian,j=hou; int piv=a[hou]; while(i<j) { while(a[i]<=piv&&i<j) i++; if(i<j) a[j--]=a[i]; while(a[j]>=piv&&i<j) j--; if(i<j) a[i++]=a[j]; } a[i]=piv; if(i-qian+1==k) return a[i]; else if(i-qian+1<k) return find(i+1,hou,k-(i-qian+1)); else return find(qian,i-1,k); } int main() { int i,j; while(scanf("%d",&n)!=EOF&&n) { for(i=0;i<n;i++) scanf("%d",&a[i]); j=find(0,n-1,n/2+1); if(n%2) printf("%d\n",j); else printf("%d\n",(find(0,n-1,n/2)+j)/2); } return 0; } /************************************************************** Problem: 1157 User: smileyk Language: C Result: Accepted Time:10 ms Memory:952 kb ****************************************************************/