五个数字如何通过六步比较得出中位数

本文介绍了一种仅使用六次比较找出五个数字中位数的算法。通过对比四个数字并逐步排除最大值,再引入第五个数字进行比较,最终确定中位数。适合初学者理解和实践。

最近遇到了一道JAVA编程作业,要求只用六步比较得出五个数字之中的中位数,我苦思冥想了三个小时还是没能搞定,然后再博客里搜了一下大家的做法,感觉太难理解,但是我注意到每种解法里都不只用Math.max或Math.min方法,我意识到是自己想偏了,于是再次回顾代码,终于把它做出来。
下面介绍一下我的思路,希望能为和我一样的小白提供帮助。(请注意区分字母大小写)
我们先来看四个数,a、b、c、d。

第一步,我们先分别比较两对四个数字。

int abBIG=Math.max(a, b);
    int A=abBIG;
    int B=a+b-abBIG; 
    int cdBIG=Math.max(c, d);
    int C=cdBIG;
    int D=c+d-cdBIG; 

这段代码作用是让A>B,C>D。用到了两次比较。

第二步,利用一个比较找到这四个数字的关系

之后我们将这两组数字中的大数字做比较,小数字也行。也就是CA是什么关系。
无论CA是什么关系,结果只会有两种:
C>A>B并且C>D(C>A时)
A>C>D并且A>B(A>C时)
不难看出,这是完全对称的两种情况。
我们可以通过如下代码使把两种情况化成一种形式

if(C>A) {
	   A=C;
	   C=abBIG;
	   D=B;
	   B=c+d-cdBIG;
   }

这段代码就是在C>A时给每个数改头换面,变成(A>C)的形式。
现在我们用了至多三步比较,得到了:A>C>D并且A>B
不难看出,这时的A是大于三个数字的,它明显失去了竞选中位数的资格。
我们把它抛弃,也就是C>D,B。

第三步,我们引入第五个数字e,重复上述操作。

还记得我们刚刚用了至多三步找到了四个数字中最大的一个数——A,并且和一对大小关系——C>D吗?我们刚才的三步里有两步用在了俩数比大小上,现在我们有了一个现成的大小关系C>D。因此,重复上述操作,只需至多两步比较。

int BeBIG=Math.max(e, B);
    int E=B+e-BeBIG;
     B=BeBIG;
     if(C>B) {
  	   B=C;
  	   C=BeBIG;
  	   D=E;
  	   E=c+d-cdBIG;
     }

如上代码可以实现如下效果:
B>C>D,并且B>E(历史总是惊人地相似)
B比三个数大,如同当初的那个A,被踢出了竞选行列。(我就说历史相似吧)
到现在,距离六步,我们只剩最后一次机会了,一定要把握好这最后的机会,揪出藏在数字队伍里的那个中位数。

最后一步,将游离在外的E与另外两个数字中较大的C做比较

int mid=Math.max(E, C);
    System.out.println("中位数为"+mid);

GAME OVER!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值