‘林夕’ 发表于 2020-9-23 20:34:59

求大佬解答!!急!!

编写一个算法,求出5个数的中位数(两个数比它小,两个数比它大),要求对于任意有效的输入,算法种发生比较的次数都要小于7次。

‘林夕’ 发表于 2020-9-23 20:36:27

想了好多算法,还是想不起来怎么在只比较不大于七次的情况下求出中位数{:10_285:}

sunrise085 发表于 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;
}

sunrise085 发表于 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:
ac
||
bd

第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             cb
|                   ||
d                   de

(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                db
                                     |
                                     b

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

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

乐乐学编程 发表于 2020-9-24 14:31:04

我来学习

‘林夕’ 发表于 2020-9-24 20:30:32

sunrise085 发表于 2020-9-23 23:34
图中a,b,c,d,e为节点,边’|’为已比较关系,大者在上,小者在下,红色为待比较数。

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

非常感谢
页: [1]
查看完整版本: 求大佬解答!!急!!