本文采用的是大堆排序求最小的K个值。需要有堆的数据结构基础哦。
代码展示:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void AdjustDown(int* parr,int n,int root)//向下调整
{
int parent=root;
int child = parent*2+1;
while(child<n)
{
if(child+1<n&&parr[child+1]>parr[child]){
child++;
}
if(parr[parent]<parr[child])
{
int tem=parr[parent];
parr[parent]=parr[child];
parr[child]=tem;
parent=child;
child=parent*2+1;
}
else
{
break;
}
}
}
int* smallestK(int* arr, int arrSize, int k, int* returnSize){
if(k==0)
{
return NULL;
}
int* st=(int*)malloc(sizeof(int)*k);
*returnSize=k;
for(int i=0;i<k;i++)
{
st[i]=arr[i];
}
for(int i=(k-2)/2;i>=0;i--)//向下调整形成大堆,(k-2)/2是求父亲节点
{
AdjustDown(st,k,i);
}
for(int i=k;i<arrSize;i++)//如果数组元素小于堆顶元素,则代替堆顶元素,再形成新的大堆
{
if(arr[i]<st[0])
{
st[0]=arr[i];
AdjustDown(st,k,0);
}
}
return st;
}
值得注意的是,已知孩子节点求父亲节点的公式是:parent=(child-1)/2。