标题:求自定类型元素序列的中位数(PAT)
只看楼主
kindol
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-3-19
结帖率:100%
已结贴  问题点数:20 回复次数:6 
求自定类型元素序列的中位数(PAT)
本题要求实现一个函数,求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
搜索更多相关主题的帖子: include 中位数 元素 接口 
2016-04-16 14:50
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
题目不是要求你输出 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
2016-04-18 13:07
kindol
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-3-19
得分:0 
回复 2楼 rjsp
hh果然是大神,是我最后return那里的问题,另外全排序也超时了,灰常感谢
2016-04-19 20:42
星空_
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-4-20
得分:0 
楼主能把最后的代码分享一下么,我用选择排序排还是不行。这是我的代码:
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];
}
2016-04-20 22:50
星空_
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-4-20
得分:0 
另外,麻烦2楼告一下怎么能看nth_element的源码或者算法呀,我找到的只有如何用nth_element的。。。
2016-04-20 22:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 5楼 星空_
你知道 快排算法 吗?每一步都是将比之小的排前面,大的排后面。
比如100个元素,假设第一步之后,下标20之前的都小于a[20],下标20之后的都大于a[20]。你想找中位数,那么一定在下标20之后,……,循环。
可以优化的有两点,第一点是,每一步以何值进行分割?第二点是,当待处理元素数目过少时,不要再用这种方法了,用插入排序比较好

自己google “nth_element 源码”、“nth_element  分析” 之类
2016-04-21 08:44
星空_
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2016-4-20
得分:0 
回复 6楼 rjsp
多谢了
2016-04-21 17:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-463712-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.163422 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved