从n个数中取出m个最大的最好的算法是什么?

从n个数中取出m个最大的最好的算法是什么?复杂度怎样?
2024-12-27 11:50:27
推荐回答(4个)
回答1:

有很多算法,复杂度也不尽相同。以下简单举几个例子:
1. n×m遍扫描
【算法基本描述】n×m遍扫描
【算法思想】每次都扫描一遍数组,取出最大元素,这样扫描m遍就能得到m个最大的数
【算法复杂度】O(nm)

2.排序后取最大m个数
【算法基本描述】对n个数排序,对拍完序后的序列取m个最大的数
【算法复杂度】视排序的复杂度,一般为O(nlogn)或O(n^2)

3.最小堆
【算法基本描述】一遍扫描+最小堆
【算法伪代码】
00-建立一个最小堆(优先队列),最小堆的大小控制在m之内
01-for 每个数:
02-----if 这个数比最小堆的堆顶元素大:
03---------弹出最小堆的最小元素
04---------把这个数插入到最小堆
05-最小堆中的m个元素就是所要求的元素
06-其中最小堆的作用就是保持里面始终有m个最大元素,且m个元素中最小的元素在堆顶。
【算法复杂度】O(nlogm) 遍历O(n) 最小堆O(logm)
【其他】如果要求n个数中取最小的m个,只要把算法反一下即可

总结:当n与m差不多大时,采用复杂度较低的排序是比较可取的,因为简单。当m<我不敢说我的算法是最好的,但是它一定是一个复杂度较低的算法。

回答2:

最好算法:时间复杂度 O(N)

在优先级队列中,选择第k个大的元素需要O(N+klogN)的时间
利用快速排序的思想,选择问题可在O(N)的时间内解决

Quickselect(S,k) 表示从S中选出前k大个数:

如果S中的元素个数为1,可以推测出k也是1,因此我们可以返回S中的唯一元素。
在S中任意选取元素v。它是中心点。
正如快速排序所做的那样,划分S-{v}为L和R。
如果k小于等于L中的元素个数,我们正查找的项目一定在集合L中。递归调用Quickselect(L,k)。否则,如果k恰好比L中的项数多1,那么中心点就是第k个最小的元素,把它作为答案返回。否则,第k个最小的元素必定位于R中,并且它是R中第(k-|L|-1)个最小的元素,再一次,我们可以做一个递归调用并返回结果。

与快速排序的两次递归调用相比,Quickselect只做了一次递归调用。快速选择的最坏情况与快速排序的最坏情况相同,是平方的。
平均时间是线性的

回答3:

冒泡排序,产生一个从大到小递减的数组Array[n],取m个最大值就是
读出从第0个元素,到第m-1个元素。

回答4:

不复杂,
做两层循环,
内循环用来两两比较选出数组中最大的元素
当然,被选出后的元素在下次循环中不参与比较
外循环用来控制选出最大元素的次数