在N个数中查找前K个最大数,主要利用小堆的特点,小堆,是根节点元素小于左右子树元素,查找前K个最大数,先将N个数中的前K个数生成小堆,接着,依次将N中的剩余的数与小堆的根节点相比,如果大于根节点,则根节点换为这个数,再将堆进行生成小堆,依次直到N中无剩余,代码如下
#define N 10000
#define K 100
void Create(int top[],int parent)
{
int child = 2 * parent + 1;
while (child < K)
{
if (child + 1 < K && top[child + 1] < top[child])
{
child++;
}
if (top[child]<top[parent])
{
swap(top[child], top[parent]);
parent = child;
child = 2 * parent + 1;
}
else
{
break;
}
}
}
void GreaterK(int a[])
{
assert(K < N);
int top[K];
for (int i = 0; i < K; i++)
{
top[i] = a[i];
}
//建堆
for (int i = (K - 2) / 2; i >= 0; i--)
{
Create( top,i);
}
//将堆顶部和大于其的值交换
for (int i = K; i < N; i++)
{
if (top[0] < a[i])
{
top[0] = a[i];
Create( top, 0);
}
}
for (int i = 0; i < K; i++)
{
cout << top[i] << " ";
}
}
int main()
{
int a[] = { 3, 45, 2, 67, 4, 9, 1, 23, 6, 0 };
GreaterK(a);
getchar();
return 0;
}
原文地址:http://10810512.blog.51cto.com/10800512/1771208