所以我尝试使用quicksort来查找向量中的第k个最小元素。但在实现它时,我的逻辑是错误的。所以我得到了错误的答案。我使用rand()随机生成枢轴索引,然后将枢轴索引移动到矢量的最右侧。看看这个:
#include <bits/stdc++.h>
using namespace std;
void swap(int& x,int &y)
{
int temp=x;
x=y;
y=temp;
}
template<typename comp>
int randompart(vector<comp>& a,int l,int r)
{
int asize=r-l+1;
int pi=rand() % asize;
swap(a[l+pi],a[r]);
int x=a[r];
//create 3 vectors small,same and larger
vector<comp> s;
vector<comp> sa;
vector<comp> la;
//if current element is smaller than x then push it to smaller vector
//else push it to larger or same vector
for(auto& i:a)
{
if(i<x)
s.push_back(move(i));
else if(i>x)
la.push_back(move(i));
else
sa.push_back(move(i));
}
int f=s.size()+sa.size()-1;
return f;
move(s.begin(),s.end(),a.begin());
move(sa.begin(),sa.end(),a.begin()+s.size());
move(la.begin(),la.end(),a.end()-la.size());
}
template<typename comp>
int kthsmallest(vector<comp>& a,int l,int r,int k)
{
if(k>0 && k<=r-l+1)
{
int pos=randompart(a,l,r);
if(pos==k)
return a[pos];
else if(pos>k)
return kthsmallest(a,l,pos-1,k);
else
return kthsmallest(a,pos+1,r,k-pos+l-1);
}
return INT_MAX;
}
int main()
{
vector<int> n({7,10,6,3,12,9});
int c=kthsmallest(n,0,n.size()-1,3);
cout << c;
return 0;
}
你可以看到它给了我错误的答案。有人可以告诉我哪里出错了吗?。
答案 0 :(得分:0)
更新k的值很可能是一个问题。诀窍是你已经通过增加左范围边界来减少k的相对位置。试想一下当l变为非零时会发生什么。因此,没有必要进一步减少k。