为什么有序数组的中位数是a[N/2]而不讨论N的奇偶性?
#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;
}
/* 你的代码将被嵌在这里 */
ElementType Median(ElementType a[], int N)
{
int i, j, dk;
ElementType tmp;
for (dk = N / 2; dk > 0; dk /= 2)
for (i = dk; i < N; i++)
{
tmp = a[i];
for (j = i; j >= dk; j -= dk)
if (tmp < a[j - dk])
a[j] = a[j - dk];
else break;
a[j] = tmp;
}
return a[N / 2];
}
因为N为正整数int类型 所以N/2也是int类型会舍弃小数点后,如果N是奇数则计算结果刚好是中间数的下标,比如N=3 则N/2 = 1
emm说反了,偶数才是/2吧
”/“在c中是整除,你可以尝试对 (a[N/2]+a[N/2+1])/2进行强制类型转换,看还会不会报错
你的理解没有错,确实是要考虑数组大小是奇数还是偶数的。
如果是奇数,中位数应该是a[N/2]
如果是偶数,中位数应该是(a[N/2] +a[N/2-1])/2
这里你需要关注一些细节,数组的大小是从1开始数的,而数组的下标是从零开始的,我只是简单想了一下,未测试,可以在这方向思考一下。
收到你的求助后过来看下,你的代码有点乱啊,弄个清晰的过来看看。。。
如果你只是想知道中位数,记着两点:
第一次发帖没有编辑好...已经修改过了..
之前忽略了下标减一的问题,但是改完之后还是同样位置报错