(算法)从10000个数中找出最大的10个

 从10000个整数中找出最大的10个,最好的算法是什么?

算法一:冒泡排序法

  千里之行,始于足下。我们先不说最好,甚至不说好。我们只问,如何“从10000个整数中找出最大的10个”?我最先想到的是用冒泡排序的办法:我们从头到尾走10趟,自然会把最大的10个数找到。方法简单,就不再这里写代码了。这个算法的复杂度是10N(N=10000)。

算法二:

  有没有更好一点的算法呢?当然。维持一个长度为10的降序数组,每一个从数组拿到的数字都与这个降序数组的最小值比较。如果小于最小值,就舍弃;如果大于最小值,就把它插入到降序数组中的合适位置,舍弃原来的最小值。这样,遍历一遍就可以找到最大的10个数。因为需要在降序数组中插入一个数,对于遍历的每个数可能都需要这样,所以其复杂为5N。

  伪代码如下:

  A[N],a[m](分别为原始数组和降序数组,其中N=10000,m=10)

  a = A[0 ... 9](将数组A的前10个数赋给数组a)

  sort a(将组数a降序排序)

  for i in A[ 10 ... N](从10到N遍历数组A)

    if A[i] > a[9] then (如果当前值比降序数组中的最小值大)

      删除a[9]

      将A[i]插入a的合适位置,使a保持降序

    end if

  end for

  输出数组a

  其实算法二还有一个优点,就是当数组很大时,可以将数据分段读入内存处理,而这样做并不影响结果。

  你还有什么办法?


该文章转载自http://www.cnblogs.com/ceachy/archive/2013/03/20/Algorithm_Max_m_from_N.html

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值