题目描述
中位数定义:一组数据按从小到大的顺序依次排列,处在中间位置的一个数(或最中间两个数据的平均数). 给出一组无序整数,求出中位数,如果求最中间两个数的平均数,向下取整即可(不需要使用浮点数)
输入描述:
该程序包含多组测试数据,每一组测试数据的第一行为N,代表该组测试数据包含的数据个数,1<=N<=10000.
接着N行为N个数据的输入,N=0时结束输入
输出描述:
输出中位数,每一组测试数据输出一行
示例1
输入
复制
4
10
30
20
40
3
40
30
50
4
1
2
3
4
0
输出
复制
25
40
2
| #include<stdio.h> #include<string.h> void qsort(int a[], int left, int right) { int low,high; low = left; high = right; int key = a[low]; if(left>=right) { return ; } while(low<high) { while(low<high&&a[high]>=key) { high--; } a[low]=a[high]; while(low<high&&a[low]<=key) { low++; } a[high]=a[low]; } a[low]=key; qsort(a,left,low-1); qsort(a,low+1,right); } int main() { int n; int a[10000]; while(scanf("%d",&n)!=EOF && n!=0) { for(int i=0;i<n;i++) { scanf("%d",&a[i]); } qsort(a,0,n-1); if(n%2==0) { int i=n/2; printf("%d\n",(a[i-1]+a[i])/2); } else { printf("%d\n",a[n/2]); } } return 0; } |
代码二:
| #include<stdio.h> #include<stdlib.h> int cmp(const void*a,const void*b){ return *(int *)a-*(int *)b; } int main(){ int n; int num[10001]; while(scanf("%d",&n)!=EOF){ if(!n)break; int i; for(i=0;i<n;++i){ scanf("%d",&num[i]); } qsort(num,n,sizeof(int),cmp); if(n%2==0){ int temp= printf("%d\n",(num[n/2]+num[n/2-1])/2); }else{ printf("%d\n",num[n/2]); } } } |