使用最小堆:
void minheap(int *des,int i,int len)
{
int tmp,p;
int cur=i;
while(cur<len)
{
p=2*cur;
if(p>len)
break;
if(des[(p+1)-1]<des[(p)-1]&&(p+1)<len)
p++;
if(des[p-1]<des[cur-1])
{
tmp=des[cur-1];
des[cur-1]=des[p-1];
des[p-1]=tmp;
cur=p;
}
else
break;
}
}
void sort(int * des, int len)
{
int i;
for(i=len/2;i>0;i--)
{
minheap(des,i,len);
}
}
void mink (int * src,int * des,int n,int k)
{
int i;
if(n<k)
{
k=n;
}
memcpy(des,src,k*sizeof(int));
sort(des,k);
for (i=k;i<n;i++)
{
if(src[i]>des[0])
{
des[0]=src[i];
minheap(des,1,len);
}
}
}