寻找前k大元素或者前k小元素

 

这个用的partition是上一篇所写的排序函数用到的partition

对于这两个函数,在主程序最好加一个判断。

如果元素个数为n,寻找前k大元素,如果k>n/2的时候,不妨选择去寻找n-k大元素,可以减少循环次数。

借鉴了Orison的代码思想:http://www.kuqin.com/algorithm/20111105/314363.html 

不知道这种是改写原创还是转载,写原创吧思想不是原创,写转载吧,又似乎有点更改了别人源代码的嫌疑。

 

template<typename T>
void findkmax(vector<T>& vec,int left,int right,int k)
{
 if(k>right-left) return;//前k个元素大于等于vector元素个数 
 int pivotloc=partition(vec,left,right);
 if(pivotloc-left==k||pivotloc-left==k-1)
  return;
 else if(pivotloc-left<k-1)
  findkmax(vec,pivotloc+1,right,k-pivotloc+left-1);
 else 
  findkmax(vec,left,pivotloc-1,k);
}
template<typename T>
void findkmin(vector<T>& vec,int left,int right,int k)
{
 if(k>right-left) return;//前k个元素大于等于vector元素个数 
 int pivotloc=partition(vec,left,right);
 if(right-pivotloc==k||right-pivotloc==k-1)
  return;
 else if(right-pivotloc<k-1)
  findkmin(vec,left,pivotloc-1,k-(right-pivotloc)-1);
 else 
  findkmin(vec,pivotloc+1,right,k);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值