不排序找出任意5元组的中间元

本文介绍了一种仅需六次比较即可从五个数中找出中位数的方法,并给出了详细的步骤说明。同时,还提供了另一种利用树形图进行比较的思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假如我们对5元组中的元素进行排序,我们只需要7次比较,就可保证把5元组排好序。详见我的博文http://blog.youkuaiyun.com/gningh/article/details/7341403

当我们只想找到中间元,不想对其排序时,我们要多少次比较?其实我们最多只需6次比较就可以得到!(次数太少了点吧?偷笑,我想了很久,想出来个错的!)

下面是从网络中搜的解决方法,原文见文章末尾的链接

方法一5个数为a,b,c,d,e 
先取a、b进行比较, c、d进行比较,假设a>b、c>d(两次比较)。 
对a、c进行比较 假设a>c(1次比较) 
那么可以得出a不可能是中位数,因为a>c>d a>b 
所以现在就是在 b,c,d,e中求一个次大的,且有条件c>d 
将b和e进行比较,假设b>e(1次比较) 
此时有 b>e 与 c>d 
已经进行了四次比较, 
将b,c进行比较 假设b>c(1次比较) 
那么有 b>c>d 
在将e与c进行比较 e,c中的较大值变为次大的。 

方法二较难看懂:

5个数之间的大小关系构成的一个树形图T。T中的一个结点代表一个数,而一条边代表它所关联的两个数的大小关系,T的根就是中位数。显然T中的一条边要由一次比赛来确定。在下面的图中,如果x大于y,则节点x在节点y的上方且x和y有一条边相连。另外,*表示一般的数,o表示下一次即将进行比较的两个数。

第1步,先任取两个数比较,结果为:

  *
  |
  *  o o *

第2步,再取另外两个数比较,结果为:

  o  o
  |  |
  *  *  *
 
第3步,按照上图比较其中两个标记为o的数,比较结果只有一种情况:

   *
  / \
 *   o
 |  
 *      o
 
第4步,按照上图比较其中两个标记为o的数,比较结果有两种情况:

   *    o               *
  /  \ /               / \
 o    *               o   o
 |                    |   |
 *                    *   *
 
第5步,按照上图比较其中两个标记为o的数,比较结果有两种情况:

  *    *               *
 / \  / \             /
/   \/   \           /
|   /\   |          /
|  /  \  |         *
| /    \ |         | \
|/      \|         |  \
o        o         |   \
|                  o    o
|                       |
|                       |
*                       *

第6步,按照上图比较其中两个标记为o的数,比较结果有两种情况:

 
*   *         *   *            *               *
 \ /           \ /             |               |
  x             x              *               *
  |            / \             |               |
  *           *   *            x               x
  |                            |              / \
  *                            *             *   *
                               |
                               *

其中的x就是中位数。


事实上,可以证明:对于n个数求中位数,至少需要3(n-1)/2次比较,并且存在一个O(n)次比较的算法。

参考文献:http://louxinyue.iteye.com/blog/812696

                        http://bbs.youkuaiyun.com/topics/210087033



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值