这个用的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);
}