注册 登录
编程论坛 C++教室

求自定类型元素序列的中位数(PAT)

kindol 发布于 2016-04-16 14:50, 5333 次点击
本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第⌈N/2⌉\lceil N/2 \rceil⌈N/2⌉大的元素。其中集合元素的类型为自定义的ElementType。

函数接口定义:
ElementType Median( ElementType A[], int N );

其中给定集合元素存放在数组A[]中,正整数N是数组元素个数。该函数须返回N个A[]元素的中位数,其值也必须是ElementType类型。

裁判测试程序样例:
#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

我的代码:
ElementType Median(ElementType A[], int N) {
    ElementType temp;
    for (int i = 0; i < N - 1; i++) {
        for (int j = i + 1; j < N; j++) {
            if (A[i] > A[j]) { temp = A[j]; A[j] = A[i]; A[i] = temp; }
            }
        }
    if (N % 2) return A[(N + 1) / 2 - 1];
        return (A[N / 2 - 1] + A[N / 2]) / 2;
}
这是一道PAT的题目,不知道问题出在哪里,提交上去后显示部分结果正确,求大神指导:
测试结果:
    测试点      结果      得分/满分  用时(ms)  内存(MB)
   测试点1    答案正确      13/13    1            1   
   测试点2    答案错误      0/3      2            1   
   测试点3    答案正确      1/1      2            1   
   测试点4    答案正确      3/3      7            1   
   测试点5    答案错误      0/3      1            1   
   测试点6    运行超时      0/2      0            0
6 回复
#2
rjsp2016-04-18 13:07
题目不是要求你输出 A[N/2] 嘛
if (N % 2) return A[(N + 1) / 2 - 1],写这么复杂干什么,不就是 return A[N/2] 嘛
return (A[N / 2 - 1] + A[N / 2]) / 2; 不知道你在搞什么鬼,反正不符合题目的要求,你的题目要求是不是没贴全我不管

另外,从算法上讲根本不需要全排序。参见 std::nth_element
#3
kindol2016-04-19 20:42
回复 2楼 rjsp
hh果然是大神,是我最后return那里的问题,另外全排序也超时了,灰常感谢
#4
星空_2016-04-20 22:50
楼主能把最后的代码分享一下么,我用选择排序排还是不行。这是我的代码:
ElementType Median(ElementType A[], int N) {
    for (int i = 0; i < (N / 2 + 1); i++) {
        int t = i;
        for (int j = i + 1; j < N; j++)
            if (A[j] > A[t])
                t = j;
        if (t != i) {
            ElementType m = A[t];
            A[t] = A[i];
            A[i] = m;
        }
    }
    return A[N / 2];
}
#5
星空_2016-04-20 22:52
另外,麻烦2楼告一下怎么能看nth_element的源码或者算法呀,我找到的只有如何用nth_element的。。。
#6
rjsp2016-04-21 08:44
回复 5楼 星空_
你知道 快排算法 吗?每一步都是将比之小的排前面,大的排后面。
比如100个元素,假设第一步之后,下标20之前的都小于a[20],下标20之后的都大于a[20]。你想找中位数,那么一定在下标20之后,……,循环。
可以优化的有两点,第一点是,每一步以何值进行分割?第二点是,当待处理元素数目过少时,不要再用这种方法了,用插入排序比较好

自己google “nth_element 源码”、“nth_element  分析” 之类
#7
星空_2016-04-21 17:40
回复 6楼 rjsp
多谢了
1