求n个数中最大的K个。
方法一:
采用堆,建立一个大小为K的堆,然后依次与n个数进行比较。
void topK(int a[],int n,int k)
{
int i;
for(i=(k-1)/2;i>=0;i--)
{
heapAdjust(a,k,i);
}
for(i=k;i<n;i++)
{
if(a[0]<a[k])
{
int temp=a[0];
a[0]=a[k];
a[k]=temp;
heapAdjust(a,k,0);
}
}
printf("\n");
for(i=0;i<k;i++)
{
printf("%d ",a[i]);
}
}
其中heapAdjust代码为:
void heapAdjust(int a[],int n,int i)
{
int temp=a[i];
int j;
for(j=2*i+1;j<n;j=j*2+1)
{
if(j+1<n && a[j+1]<a[j])
{
++j;
}
if(a[j]<temp)
{
a[i]=a[j];
i=j;
}
else
{
break;
}
}
a[i]=temp;
}
方法二:
采用快排思想
void topK2(int a[],int l,int r,int k)
{
int i=l,j=r;
int temp=a[l];
while(i<j)
{
while(i<j&&a[j]>temp)
{
j--;
}
a[i]=a[j];
i++;
while(i<j &&a[i]<temp)
{
i++;
}
a[j]=a[i];
j--;
}
a[i]=temp;
if(r-i+1>k)
{
topK2(a,i+1,r,k);
}
else if(r-i+1<k)
{
topK2(a,l,i-1,k-r-1+i);
}
else
{
return;
}
}