长度为n无序数组找屎

假定这个n的长度为特别大
1…找一个最小数

2.找一个最大数和一个最小数
最笨的方法排序
取最大值,和最小值,所需时间为n2

傻子的办法 比较法
存两个临时变量
第一个临时变量,一直保存最小的值,遍历数组,遇见比它小的进行交换,复杂度一直为n
另一个临时变量,则保存最大值

聪明点的人 两两比较法
第一步 首先让所有的元素参与两两比较,这样总共比较了n/2次,最大数肯定在胜者组中,最小数肯定在败者组中
第二步 然后从容量为n/2的胜者组中找到最大的数,最少要比较n/2 - 1次;同理,从容量为n/2的败者组中找到最小的数,最少要比较n/2 - 1次
第三步 同理,从容量为n/2的败者组中找到最小的数,最少要比较n/2 - 1次。所以总共需要比较(3n/2) - 2 次。以上假设n为偶数。奇数同理。
这是同时寻找最大数和最小数的最优算法。

3.找第二小的数

傻子的办法
一种习惯的方法是:先找出最大的元素,这需要比较n-1次;然后从剩下的n-1个元素中找到最大的,这个元素就是我们要找的第二大元素,这需要比较n-2次。做一总共比较2n-3次。

普通人的办法
还有一个更优的方法:
(1) 我们考虑淘汰赛的比较法,淘汰赛结束后,找出冠军我们需要n-1次比较;如下图所示,找到12需要比较7次。
(2) 此时我们要考虑到,亚军应该存在于败给冠军的这些选手中(否则,每个元素都至少有两个元素比它大),由于与冠军比过的元素个数为┌log2n┐,从这些元素中找到最大值需要比较┌log2n┐ - 1次;如下图所示,亚军应该在10,11,4这三个元素中。否则,如果亚军是5,那么冠军12比它大,与它比较过的10也比它大,至少两个元素大于5,所以5肯定不是亚军的候选者。
淘汰赛
(3)从而找出亚军要比较n-1+┌log2n┐-1 = n-2+┌log2n┐次比较。这个算法是寻找亚军的最优算法。

4.找m小的数

5.同时寻找最大数和最小数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值