方法1:
排序后直接选出,这样时间开销为O(NlogN)
方法2:
先用选第k大元素的方法选出第k大元素(具体可以参考选第k大元素的那篇BLOG),按Knuth的说法,时间开销是O(n),这样的话,如果我们找到第n-m大的元素,设其为a,然后顺序扫描一遍原序列,即可以得到最大的m个数,这样做的前提是序列中没有重复元素。时间开销为O(n)
方法3:
构建一个m元最小堆,然后依次比较后续元素与堆顶元素的大小,如果小,则舍弃;如果大,则修改堆顶元素为新元素,然后调整堆结构。
这样做的时间开销为O(mlogm+(n-m)logm),实际当中,(n-m)logm这一项的系数应该会比(n-m)小很多。