编程之美2.5寻找最大的K个数

使用最小堆:

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);			
		}
	}
}

    原文作者:yzx41099296
    原文地址: https://blog.csdn.net/yzx41099296/article/details/7909336
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞