void AdjustDown(double A[], int i, int len)
{
double temp = A[i]; // 暂存A[i]
for(int largest=2*i+1; largest<len; largest=2*largest+1)
{
if(largest!=len-1 && A[largest+1]>A[largest])
++largest; // 如果右子结点大
if(temp < A[largest])
{
A[i] = A[largest];
i = largest; // 记录交换后的位置
}
else
break;
}
A[i] = temp; // 被筛选结点的值放入最终位置
}
/* 建堆 */
void BuildMaxHeap(double A[], int len)
{
for(int i=len/2-1; i>=0; --i) // 从i=n/2-1到0,反复调整堆
AdjustDown(A, i, len);
}
/* 维护 A[0...k-1] 这个大根堆 */
void topK(double A[], int n, int k)
{
BuildMaxHeap(A, k); // 先用前面的k个数建大根堆
for(int i=k; i<n; ++i)
{
if(A[i] < A[0]) // 如果小于堆顶元素,替换之
{
double tmp = A[0];
A[0] = A[i];
A[i] = tmp;
AdjustDown(A, 0, k); // 向下调整
}
}
}
最小的K个数,堆维护问题
最新推荐文章于 2023-04-27 17:00:41 发布