为什么有序数组的中位数是a[N/2]而不讨论N的奇偶性?

为什么有序数组的中位数是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是偶数那么中位数应该为 (a[N/2]+a[N/2-1])/2 为什么这样写会报错?

img

因为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开始数的,而数组的下标是从零开始的,我只是简单想了一下,未测试,可以在这方向思考一下。

收到你的求助后过来看下,你的代码有点乱啊,弄个清晰的过来看看。。。
如果你只是想知道中位数,记着两点:

  1. N 为奇数时,中位数为 N/2;
  2. N 为偶数时,中位数为 N/2 和 N/2 -1;

第一次发帖没有编辑好...已经修改过了..
之前忽略了下标减一的问题,但是改完之后还是同样位置报错