找出N个数组中第二大的数,需要比较多少次呢?

方法一、比较笨的方法

先找到本数组中的最大数X,需要n-1次比较,再在剩下的数组中去找最大数X’,需要n-2次比较

则X’就是第二大的数,这需要(n-1) + (n-2)次比较

方法二、我们也可以在数组中,两数结合,分别求出最大值 和 次大值,之后每两个数结合求出的最值 在相互比较,得到最值得最大值 和 次大值

具体思路:

把数组中的每两个元素分为一组,每组中的最大数为F,第二大数为S。

假设相邻两组的最大数和第二大数分别是:Fleft,Si 和 Fright,Sj,。

则这两组合并为一组后,其中最大数和第二大数可能是:

1、若Fi > Fj,则最大数是Fi;

      若Si >Fj,则第二大数是Si;否则,第二大数是Fj

2、若Fi< Fj,则最大数是Fj

      若Fi>Sj,则第二大数是Fi;否则,第二大数是Sj

比较次数:共有N/2组,每组需要比较倆次得出本组的最大数和第二大数;共需比较N/2 * 2次。

方法三、分治法

思路:和上面的思路是一样的

把数组分成两部分,其最大数和第二大数分别是:Fleft,Sleft,Fright,Sright。合并时的情况可能为:

1、Fleft > Fright,最大数是Fleft;若Sleft>Fright,则第二大数是Sleft,否则第二大数是Fright;

2、Fleft < Fright,最大数是Fright;若Fleft>Sright,则第二大数Fleft,否则第二大数是Sright。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值