top k 问题解决

基于快排思想的查找

#include <iostream>
using namespace std;
int partaction(int *a,int left,int right)  
{  
    int tmp=a[left];  
    while(left<right)  
    {  
        while(right>left&&a[right]>=tmp)//要有等号要不会出现你换过来我换过去的情况发生  
        {  
            right--;  
        }  
        a[left]=a[right];  
        while(left<right&&a[left]<=tmp)  
        {  
            left++;  
        }  
        a[right]=a[left];  
    }  
    a[left]=tmp;  
    return left;  
}  
int search(int left,int right,int *arr,int k)
{
	int pos =partaction(arr,left,right);
	if(pos==k) return arr[pos];
	if(pos<k)
	{
		return search(pos,right,arr,k);
	}
	if(pos>k)
	{
		return search(left,pos,arr,k);
	}
}
int main()
{
	int arr[10]={2,4,5,6,7,21,1,3,5,2};
	cout<<search(0,9,arr,2);
}

小根堆的topk问题解决思想
int main()
{
	priority_queue<int,vector<int>,greater<int>> queue;
	int a[10] = { 2, 6, 7, 8, 1, 6, 4, 1, 3,0 };
	int k =1;
	int i;
	for (i = 0; i <k; i++)
	{
		queue.push(a[i]);
	}
	for (i; i <10; i++)
	{
		if (a[i] > queue.top())
		{
			queue.pop();
			queue.push(a[i]);
		}
	}
	cout << queue.top() << endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值