N个浮点数中,有相同的浮点数,找出其中最大的k个不同的浮点数;
用容量为k的最小堆存储最大的k个不同的浮点数,堆顶就是k个中最小的浮点数,遍历N个数,与堆顶元素比较大小,若比堆顶元素大,则与之交换,调整最小堆。
void Heap(float heap[],int i,int size)
{
int l,r,mix;
float temp;
l = 2*i;
r = 2*i+1;
if(l<size&&heap[l-1]<heap[i-1])
mix = l;
else
mix = i;
if(r<size&&heap[r-1]<heap[mix-1])
mix = r;
if(mix != i)
{
temp = heap[mix-1];
heap[mix-1] = heap[i-1];
heap[i-1] = temp;
Heap(heap,mix,size);
}
}
void createHeap_And_Sort(float heap[],int n)
{
int m = n/2,size = n;
for(int j = m;j>0;j--)
Heap(heap,j,size);
}
int main(void)
{
int k = 3,num=0,flag=0,i,j;
float data[10] = {1.5,1.5,2.5,2.5,3.5,3.5,5,0,-1.5,3.5};
float heap[3];
heap[0] = data[0];
num++;
for(i = 1;i<10;i++)
{
for(j=0;j<num;j++)
if(data[i]==heap[j])
{
flag = 1;
break;
}
if(flag == 0)
{
heap[num] = data[i];
num++;
}
if(num==k)
break;
flag = 0;
}
createHeap_And_Sort(heap,k);
for(i = k;i<10;i++)
{
if(data[i]>heap[0])
{
heap[0] = data[i];
Heap(heap,0,k);
}
}
for(i = 0;i<k;i++)
cout<<heap[i]<<endl;
return 0;
}