本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第⌊(N+1)/2⌋大的元素。其中集合元素的类型为自定义的ElementType。web
函数接口定义:编程
ElementType Median( ElementType A[], int N );
其中给定集合元素存放在数组A[]中,正整数N是数组元素个数。该函数须返回N个A[]元素的中位数,其值也必须是ElementType类型。数组
裁判测试程序样例:svg
#include <stdio.h> #define MAXN 10 typedef float ElementType; ElementType Median( ElementType A[], int N ); int main () { ElementType A[MAXN]; int N, i; scanf("%d", &N); for ( i=0; i<N; i++ ) scanf("%f", &A[i]); printf("%.2f\n", Median(A, N)); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
3
12.3 34 -5
输出样例:
12.30函数
这道题,出得一点也不讲师德,来,骗,来,搞我心态,我一个19岁的老同志,这好吗,这很差!我就想划下水,作下简单的编程题,欺骗本身在努力学习,因而看到了序列中位数,我说这道题不就是排序而后给出指定的位置吗,为了给本身加大难度,我上来就是一个快速排序,一个计算输出下标,我所有想到了啊,按照传统,解题点到为止,因而我点了提交,结果显示最大N,超时,大意了啊,没想到这题暗藏玄机,看来是有备而来,我说,你这道题没水准标题骗淫,她说,她是乱出的,这题可不是乱出的啊,暗藏希尔排序,而希尔排序里又有直接插入排序,后来她说她在浙大教书,出过几本书,好家伙,看来是有备而来!
我劝,这位出题人,耗子尾汁,好好反思。之后不要再犯这样的诡计,小诡计啊。
pta要以和为贵,要将师德,不要搞窝里斗。谢谢朋友们。学习
ElementType Median( ElementType A[], int N ) { int i,j,gap; //利用希尔排序排序好数组,最深层循环为希尔排序里的直接插入排序法、 for(gap=N/2;gap>0;gap/=2)//步长 for(i=0;i<gap;i++) { for(j=i+gap;j<N;j+=gap) if(A[j]<A[j-gap]){ float temp=A[j]; int k=j-gap; while(k>=0&&A[k]>temp) { A[k+gap]=A[k]; k-=gap; } A[k+gap]=temp; } } return A[N/2]; }
文末附上开始写的垃圾代码测试
int kuaipai(ElementType A[],int i,int N) { int j=i,k=N; float box=A[i]; while(j<k) { while(j<k&&A[k]>=box) k--; if(k>j) { A[j]=A[k]; j++; } while(j<k&&A[j]<box) j++; if(j<k) { A[k]=A[j]; k--; } } A[j]=box; return j; } void part2(ElementType A[],int i,int N) { if(i<N){ int r=kuaipai(A,i,N); part2(A,r+1,N); part2(A,i,r-1); } } ElementType Median( ElementType A[], int N ) { part2(A,0,N-1); if(N%2==0) return (A[N/2]+A[N/2-1])/2.0; else return A[N/2]; }