标题:关于数组中位数的问题
只看楼主
小cai鸟
Rank: 2
等 级:论坛游民
帖 子:53
专家分:25
注 册:2018-7-13
结帖率:60%
已结贴  问题点数:10 回复次数:8 
关于数组中位数的问题
/*本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第⌊N/2+1⌋大的元素。其中集合元素的类型为自定义的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;
}

/*以上是题目*/

ElementType Median( ElementType A[], int N ){
    int i, j;
    ElementType temp;
    int flag;

    flag = 1;
    for(i=0; i<N-1&&flag; i++){
        flag = 0;
        for(j=0; j<=N-i-1; j++){
            if(A[j]>A[j+1]){
                temp = A[j];
                A[j] = A[j+1];
                A[j+1] = temp;
                flag = 1;
            }
        }
    }

    return A[N/2+1];
}

/*数据大部分是对的,但是在PTA中提交不上,提示运行超时并且还有一处错误*/
/*希望大家帮忙看看看有什么需要改进的地方*/
搜索更多相关主题的帖子: 数组 位数 int temp flag 
2018-07-13 12:19
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:4 
求N个集合元素A[]的中位数,即序列中第⌊N/2+1⌋大的元素
如果N=1,那是求第1大,这个“第一”是base 0,还是base 1?
如果N=2,那是求第2大,这个“第二”是base 0,还是base 1?
假如是 base 0 的话,那么数组溢出
假如是 base 1 的话,你最后就不应该是 return A[N/2+1],而应该是 return A[N/2]
这事不怪你,只怪出题者就是个SB

按照你的排序算法
for(i=0; i<N-1&&flag; i++){
        for(j=0; j<=N-i-1; j++){
很显然第二处应该将 <= 改为 <,否则看上去就别扭,当然,事实也是如此

说回你这算法,你听说过 快速排序 算法吗?
用快速排序来解这道题,第一遍确定好了某个数所在的位置,那么如果它位置偏左,其后左边的就不用考虑了;如果它位置偏右,其后右边的就不用考虑了。……
快速排序不会的话,直接看C库中的qsort,或C++库中的nth_element




2018-07-13 13:41
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:4 
中位数不是这样定义的吗

如果总共有奇数个 那没啥说的 就是最中间的那个
如果有偶数个 那就是最中间的两个数的平均数

DO IT YOURSELF !
2018-07-13 14:05
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:4 
回复 3楼 wp231957
    你的定义是错误的,正确的定义是:
    中位数,又称中点数,中值。中数是按顺序排列的一组数据中居于中间位置的数,即在这组数据中,有一半的数据比他大,有一半的数据比他小。
    对于一组有限个数的数据来说,它们的中位数是这样的一种数:这群数据里的一半的数据比它大,而另外一半数据比它小。 计算有限个数的数据的中位数的方法是:把所有的同类数据按照大小的顺序排列。如果数据的个数是奇数,则中间那个数据就是这群数据的中位数;如果数据的个数是偶数,则中间那2个数据的算术平均值就是这群数据的中位数。
中位数:也就是选取中间的数,是一种衡量集中趋势的方法。
例1
找出这组数据:23、29、20、32、23、21、33、25 的中位数。
解:
首先将该组数据进行排列(这里按从小到大的顺序),得到:
20、21、23、23、25、29、32、33
因为该组数据一共由8个数据组成,即n为偶数,故按中位数的计算方法,得到中位数=(23+25)/2=24.即第四个数和第五个数的平均数。
例2
找出这组数据:10、20、 20、 20、 30的中位数。
解:
首先将该组数据进行排列(这里按从小到大的顺序),得到:
10、 20、 20、 20、 30
因为该组数据一共由5个数据组成,即n为奇数,故按中位数的计算方法,得到中位数为20,即第3个数。
2018-07-13 15:06
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
哦,忘了是有序的了

DO IT YOURSELF !
2018-07-13 15:08
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
得分:0 
程序代码:
#include <stdio.h>
#include <math.h>
#define N 10
int Search(double a[]);
int main()
{
  double a[N];
  int i,mid;
  printf("请输入数据:");
  for(i=0;i<N;i++)
  scanf("%lf",&a[i]);
  mid=Search(a);
  printf("中间值为:%.12f\n",a[mid]);
}
int Search(double a[])
{
  int i,j,flag;
  double tmp;
  for(i=N-1;i>=0;i--)
    {
     flag=0;
     for(j=0;j<i;j++)
       {
          if(fabs(a[j])-fabs(a[j+1])>1e-10)
           {
             tmp=a[j];
             a[j]=a[j+1];
             a[j+1]=tmp;
             flag++;
           }
       }
      if(flag==0) break;
    }
  if(N%2)
      return N/2+1;
  else
      return N/2;
}
2018-07-13 15:55
小cai鸟
Rank: 2
等 级:论坛游民
帖 子:53
专家分:25
注 册:2018-7-13
得分:0 
回复 2楼 rjsp
嗯嗯   我用快排试试
2018-07-14 09:16
小cai鸟
Rank: 2
等 级:论坛游民
帖 子:53
专家分:25
注 册:2018-7-13
得分:0 
回复 3楼 wp231957
没办法  题目是这么说的
2018-07-14 09:16
小cai鸟
Rank: 2
等 级:论坛游民
帖 子:53
专家分:25
注 册:2018-7-13
得分:0 
回复 6楼 自学的数学
好的
2018-07-14 09:17



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




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

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