码迷,mamicode.com
首页 > 编程语言 > 详细

面试算法题:16个数,最多用20次比较,找出第二大的数?

时间:2015-03-20 23:34:07      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:

这道题最笨的方法就是先从16个数中选出最大的数,然后再从剩下的15个数中选出最大数就可得到答案,因此,需要15+14=29次比较。

既然这道题要求在20次比较之内就能找出第二大的数,那我们就想能简单的方法。

假设16个数中最大的是A,第二大的是B。

首先将16个数两两进行比较,较大者胜出,然后再在胜出者中进行两两比较,按此方法,最后选出最大数A,如下所示

技术分享

红色路线是最大数经过的路径。

 

接下来分析B可能存在的位置。

将16个数分为左部分和右部分各8位:

1、如果A和B在两个不同的部分(A在左部分,B在右部分,则B是右部分的最大者),因此按照上面的比较方法,B将在根节点的右子节点,即图中红色1节点;

2、如果A,B处于同一个部分(假设都在左部分,如果同在右部分,分析方法一样),则在左部分的8个节点中,按照方法1继续划分查找;

通过这种方式分析可以知道,A和B一定会做一次比较(想想为什么)。在图中,如果A按照红色路线上升,则B可能出现的位置就是红色节点1,2,3,4。

四个红色位置比较要3次。

因此最终需要:

8+4+2+1+3=18

 

 

面试算法题:16个数,最多用20次比较,找出第二大的数?

标签:

原文地址:http://www.cnblogs.com/LCCRNblog/p/4354724.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!