最近在读《数据结构与算法分析(C语言描述)》,在优先队列(堆)一节中,作者总结了关于“选择问题——求第k个最大的元素”的几种思路,在此简单总结一下:
第一种
将这
N
个数读进一个数组中,再通过某种简单的算法,比如冒泡排序、选择排序等,以递减顺序将数组进行排序,然后返回位置
第二种
这是对第一种算法的简单优化。申请一个大小为
k
的数组,然后先把前
该算法的平均运行时间为
第三种
简单来说:建最大堆!
将
N
个元素读入数组,然后对该数组执行
时间复杂度分析:
- 如果使用
BuildHeap
,构造堆的最坏情形用时是
O(N)
,而每次
DeleteMin
用时
O(logN)
(要随时调整堆),由于有
k
次
DeleteMin ,因此总运行时间为 O(N+klogN) 。 - 如果 k=O(N/logN) ,那么运行时间取决于 BuildHeap 操作,即 O(N)
- 对于大的
k
的值,运行时间为
O(klongN)
第四种
算是第二种和第三种思路的结合。
也就是用堆来实现大小为
k
的数组