在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;

}