基于快排思想的查找
#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;
}