鱼C论坛

 找回密码
 立即注册
查看: 1105|回复: 5

[已解决]求大佬解答!!急!!

[复制链接]
发表于 2020-9-23 20:34:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
编写一个算法,求出5个数的中位数(两个数比它小,两个数比它大),要求对于任意有效的输入,算法种发生比较的次数都要小于7次。
最佳答案
2020-9-23 23:28:44
如果只是求中位数的话,六次就够了,排序才需要七次
#include<stdio.h>
int main()
{
    int a,b,c,d,e;
    int max1,max2,min1,min2;
    scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
    if (a>b)//第一次
        max1=a,min1=b;
    else
        max1=b,min1=a;
    if (c>d)//第二次
        max2=c,min2=d;
    else
        max2=d,min2=c;
    if (max1>max2)//第三次
        if (min1>e)//第四次
            if(min1>max2)//第五次
                if(max2>e)//第六次
                    printf("中位数是:%d",max2);
                else
                    printf("中位数是:%d",e);
            else
                if(min1>min2)//第六次
                    printf("中位数是:%d",min1);
                else
                    printf("中位数是:%d",min2);
        else
            if(e>max2)//第五次
                if(max2>min1)//第六次
                    printf("中位数是:%d",max2);
                else
                    printf("中位数是:%d",min1);
            else
                if(min2>e)//第六次
                    printf("中位数是:%d",min2);
                else
                    printf("中位数是:%d",e);
    else
        if (min2>e)//第四次
            if(min2>max1)//第五次
                if(max1>e)//第六次
                    printf("中位数是:%d",max1);
                else
                    printf("中位数是:%d",e);
            else
                if(min2>min1)//第六次
                    printf("中位数是:%d",min2);
                else
                    printf("中位数是:%d",min1);
        else
            if(e>max1)//第五次
                if(max1>min2)//第六次
                    printf("中位数是:%d",max1);
                else
                    printf("中位数是:%d",min2);
            else
                if(min1>e)//第六次
                    printf("中位数是:%d",min1);
                else
                    printf("中位数是:%d",e);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-23 20:36:27 | 显示全部楼层
想了好多算法,还是想不起来怎么在只比较不大于七次的情况下求出中位数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-23 23:28:44 | 显示全部楼层    本楼为最佳答案   
如果只是求中位数的话,六次就够了,排序才需要七次
#include<stdio.h>
int main()
{
    int a,b,c,d,e;
    int max1,max2,min1,min2;
    scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
    if (a>b)//第一次
        max1=a,min1=b;
    else
        max1=b,min1=a;
    if (c>d)//第二次
        max2=c,min2=d;
    else
        max2=d,min2=c;
    if (max1>max2)//第三次
        if (min1>e)//第四次
            if(min1>max2)//第五次
                if(max2>e)//第六次
                    printf("中位数是:%d",max2);
                else
                    printf("中位数是:%d",e);
            else
                if(min1>min2)//第六次
                    printf("中位数是:%d",min1);
                else
                    printf("中位数是:%d",min2);
        else
            if(e>max2)//第五次
                if(max2>min1)//第六次
                    printf("中位数是:%d",max2);
                else
                    printf("中位数是:%d",min1);
            else
                if(min2>e)//第六次
                    printf("中位数是:%d",min2);
                else
                    printf("中位数是:%d",e);
    else
        if (min2>e)//第四次
            if(min2>max1)//第五次
                if(max1>e)//第六次
                    printf("中位数是:%d",max1);
                else
                    printf("中位数是:%d",e);
            else
                if(min2>min1)//第六次
                    printf("中位数是:%d",min2);
                else
                    printf("中位数是:%d",min1);
        else
            if(e>max1)//第五次
                if(max1>min2)//第六次
                    printf("中位数是:%d",max1);
                else
                    printf("中位数是:%d",min2);
            else
                if(min1>e)//第六次
                    printf("中位数是:%d",min1);
                else
                    printf("中位数是:%d",e);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-23 23:34:33 | 显示全部楼层
本帖最后由 sunrise085 于 2020-11-3 21:49 编辑

图中a,b,c,d,e为节点,边’|’为已比较关系,大者在上,小者在下,红色为待比较数。

第1次比较,先任取两个数a, b进行比较,不妨设结果为a>b:
  a
  |
  b

第2次比较,再取另外两个数c, d进行比较,不妨设结果为c>d:
  a  c
  |  |
  b  d

第3次比较,按照上图比较a, c,比较结果如下(由于树3.1和3.2形状相同,以下仅考虑3.1的情况,而3.2同理可得):
   a                c
  /  \           /  \
c    b         a      d
|              |         
d              b

(3.1)                   (3.2)

第4次比较,按照上图3.1比较短分枝中红色数b, e,比较结果有两种情况:
   a   e             a
  /  \ /           / \
c     b             c  b
|                   |  |
d                   d  e

(4.1)            (4.2)

第5次比较,按照上图比较其中两个标记为红色的数,4.1比较c, e,4.2比较c, b:
4.1 比较后有两种情况:e>c,见5.1;e<c,见5.2;
4.2比较后有两种情况:c>b,见5.3;c<b,见5.4;
由于树5.2,5.3,5.4形状相同,因此下面仅以5.2为例,5.3,5.4做法与5.2同。
a    e                 a                          a                        a
\ /                     |                          |                        |
/ \                     c                          c                         b
c   b                 /  \                      /  \                    /  \
|                     d    e                   d    b                  e    c
d                          |                          |                        |
                            b                          e                        d

(5.1)           (5.2)                   (5.3)                (5.4)

第6次比较,按照上图比较其中两个标记为红色的数,比较结果有两种情况:
5.1中c, b比较,c<b,b为中值,见6.1;c>b,c为中值,见6.2;
5.2中d, e比较,d>e,d为中值,见6.3;d<e,e为中值,见6.4;
a   e        a    e              a                   a
\  /          \  /               |                   |
  b             c                  c                   c
  |           /  \                |                  |
  c          d   b                d                  e
  |                                 |                 / \
  d                                 e                d  b
                                     |
                                     b

(6.1)        (6.2)         (6.3)             (6.4)

至此,经6次比较得出5个数的中值。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-24 14:31:04 | 显示全部楼层
我来学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-24 20:30:32 | 显示全部楼层
sunrise085 发表于 2020-9-23 23:34
图中a,b,c,d,e为节点,边’|’为已比较关系,大者在上,小者在下,红色为待比较数。

第1次比较,先任取 ...

非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 03:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表