直接上代码,其中有的c和c++混乱的地方,在vs2008下.cpp文件测试通过。
#include <stdio.h>
#include <stdlib.h>
//从节点cur开始向下成调整部分大根堆
//len为数组长度,数组下标从0开始
template<typename T>
void heap_adjust(T array[],int cur,int len)
{
int l = cur*2+1;
int r = l+1;
int maxI = cur;
T elem;
if (l<len && array[l]>array[cur])
maxI = l;
if (r<len && array[r]>array[maxI])
maxI = r;
if (maxI!=cur)
{
elem = array[cur];
array[cur] = array[maxI];
array[maxI] = elem;
heap_adjust(array,maxI,len);
}
}
int main(void)
{
/* n个数找出其中最小的k个数 */
printf("请输入k的值:\n");
int k,count = 0,input_num;
scanf("%d",&k);
int *ptr_heap = (int*)malloc(k*sizeof(int));
while (scanf("%d",&input_num) != EOF)
{
if (count<k)
{
ptr_heap[count++] = input_num;
if (count==k)
{
//将长度为k的数组建立成大根堆
for(int i=(k-1)/2;i>=0;i--)
heap_adjust(ptr_heap,i,k);
}
continue;
}
//将input_num与大根堆的根(ptr_heap[0])作比较.
//若小于根则留下input_num,同时用当前值input_num替换掉ptr_heap[0],然后调整堆;
//反之读取下一个数据。
if (input_num<ptr_heap[0])
{
ptr_heap[0] = input_num;
heap_adjust(ptr_heap,0,k);
}
else
continue;
}
for (int i=0;i<k;i++)
printf(" %d",ptr_heap[i]);
printf("\n");
free(ptr_heap);
ptr_heap = NULL;
return 0;
}
测试结果截图: