void Swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void Down(int* a, int sz, int parent)
{
int child = parent * 2 + 1;
while (child < sz)
{
if (child + 1 < sz && a[child + 1] < a[child])
{
child++;
}
if (a[child] < a[parent])
{
Swap(&a[child], &a[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
void PrintTopk(int* a, int n, int k)
{
int* Heap = (int*)malloc(sizeof(int) * k);
assert(Heap);
for (int i = 0; i < k; i++) //把N前K个数 以Down的方式进行建堆
{
Heap[i] = a[i];
}
for (int i = (k - 1 - 1) / 2; i >= 0; i--)
{
Down(Heap, k, i); //建立小堆
}
for (int i = k; i < n; i++)
{
if (a[i] > Heap[0]) //如果比堆顶的数字大就进行替换
{
Heap[0] = a[i];
Down(Heap, k, 0);
}
}
for (int i = 0; i < k; i++)
{
printf("%d ", Heap[i]);
}
}
int main()
{
int n = 1000;
int* a = (int*)malloc(sizeof(int) * n);
srand(time(0));
for (int i = 0; i < n; i++)
{
a[i] = rand() % 1000;
}
a[32] = 1000 + 3;
a[1] = 1000 + 10;
a[4] = 1000 + 7;
PrintTopk(a, n, 3);
return 0;
}
时间复杂度为O((N-K)*logK )