找出N个浮点数中最大的k个不同的浮点数



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


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值