zoukankan      html  css  js  c++  java
  • 面试算法题:16个数,最多用20次比较,找出第二大的数?

    这道题最笨的方法就是先从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

     

  • 相关阅读:
    点餐系统的设计与实现注意点与解决办法
    不借助临时变量交换两个数值
    python2.7之乱码问题
    netty-学习笔记
    每天一个linux命令---curl
    每天一个linux命令---useradd
    webservice 学习笔记
    每天一个linux命令---kill
    XML解析
    每天一个linux命令---tar
  • 原文地址:https://www.cnblogs.com/LCCRNblog/p/4354724.html
Copyright © 2011-2022 走看看