最小堆
最小堆是一种完全二叉树,特点是根节点比两个子节点都小
比如在20个元素中求第8大的数怎么做呢?
利用最小堆的特性构建大小为8的最小堆(比如用前8个元素)如上图,再将接下来十二个元素分别与堆头作比较,如果大于则取代之插入进来并刷新最小堆,小于则直接下一位。全部遍历后。最后的堆头即是我们的第8大的数。因为其他的元素都比堆头小,比堆头大的数都在堆头下面。
//(2) The function is to find the Kth largest integer from a list A of N(>K) integers.
The function BuildMinHeap(H, K) is to arrange integers H[1] ... H[K] into a min-heap.
int FindKthLargest ( int A[], int N, int K )
{
int *H, i, next, child;
H = (int *)malloc(++N, sizeof(int));
for ( i=1; i<N; i++ ) H[i] = A[i-1];
BuildMinHeap(H, K);
for ( next=K+1; next < N; next++ ) {
H[0] = H[next];
if ( H[0] > H[1] ) {
for ( i=1; i*2 <= K; i=child ) {
child = i*2;
if ( child!=K && ①________H[child]>H[child+!]__________) child++;//找到子节点较小的
if (②___________H[0]>H[child]_______)
H[i] = H[child];//孩子节点较小的取代他的父节点空出位置
else break;
}
③____H[i]=H[0]__________;//待插入节点插入进来
}
}
return ④__H[1]____;//返回第Kth Largest integer
}