求第k小数(分治思想)

第k小数

利用快速排序的思想,从序列中取一个数mid,然后把序列分成小于等于mid和大于等于mid的两部分,由两个部分的元素个数和k的大小关系可以确定这个数是在哪个部分。对部分序列的探查可以递归处理。

时间复杂度近似为O(n)


代码示例

//O(n)求sort(升序)后第k位数字
#include
using namespace std;

int arr[1000010];

void quickSelect(int a[],int l,int r,int rank)
{
    int i=l,j=r,mid=a[(l+r)>>1];
    do{
        while(a[i]mid) --j;
        if(i<=j){
            swap(a[i],a[j]);
            ++i;
            --j;
        }
    }while(i<=j);
    if(l<=j && rank<=j-l+1) quickSelect(a,l,j,rank);
    if(i<=r && rank>=i-l+1) quickSelect(a,i,r,rank-(i-l));
}

int quick_select(int a[],int n,int k)//第k小
{
    quickSelect(a,1,n,k);
    return a[k];
}

int main()
{
    srand(time(0));
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;++i) arr[i]=rand()%1000;
    for(int i=1;i<=n;++i) cout<


你可能感兴趣的:(Basic,Algorithm)