在N個亂序數字中查找第k大的數字

若隨機選取樞紐,線性期望時間O(N)

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
int a[N];
int qs(int l,int r)
{
    int x=a[l];
    while(l<r)
    {
        while(l<r&&a[r]>=x) r--;
        a[l]=a[r];
        while(l<r&&a[l]<=x) l++;
        a[r]=a[l];
    }
    a[l]=x;
    return l;
}
int dfs(int k,int l,int r)
{
    int x=qs(l,r);
    if(x==k) cout<<a[x]<<endl;
    else if(x>k) dfs(k,l,x-1);
    else         dfs(k,x+1,r);
}
int main()
{
    int n,k;
    cin>>n;
    for(int i=0;i<n;i++) cin>>a[i];
    cin>>k;
    dfs(k-1,0,n-1);
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章