top k 问题解决

来源:互联网 发布:王者荣耀用java还是c 编辑:程序博客网 时间:2024/06/16 09:12

基于快排思想的查找

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


原创粉丝点击