使用随机快速排序查找第k个最小元素,给出逻辑错误

时间:2018-02-13 13:37:26

标签: algorithm sorting c++11

所以我尝试使用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;

}

你可以看到它给了我错误的答案。有人可以告诉我哪里出错了吗?。

1 个答案:

答案 0 :(得分:0)

更新k的值很可能是一个问题。诀窍是你已经通过增加左范围边界来减少k的相对位置。试想一下当l变为非零时会发生什么。因此,没有必要进一步减少k。