STL库中实现了nth_element函数,实现的功能是 “返回n个元素中的第k小的元素”。
首先,头脑风暴一下“返回n个元素中的第k小的元素”的算法:
1 排序 ,首选快排 O(n*logn),取出第k个即可。
2 其次,是维护一个大小为k的数组,找出数组中的最大值kmax,然后依次遍历剩下的 n-k 个元素,如果小雨kmax,则替换掉kmax
元素,然后再找出其中的最大值,重复上述过程,时间复杂度为 O(n*k)。
3 对2的改进,使用大小为k个大顶堆,时间复杂度为 O(n*logk),代码实现如下。
void max_heapify(vector
&A, int cur, int len)
{
int left = 2*cur+1, right = 2*cur+2;
if(left >= len) return;
int largest = cur;
if(left < len && A[largest] < A[left])
largest = left;
if(right < len && A[largest] < A[right])
largest = right;
if(largest != cur)
{
swap(A[largest], A[cur]);
max_heapify(A,largest, len);
}
}
void buildHeap(vector
&A)
{
int len = A.size();
for(int i = len/2 ; i >= 0 ; --i)
{
max_heapify(A,i,len);
}
copy(A.begin(), A.end(), ostream_iterator