快排找第k大(小)元素

来源:互联网 发布:java单例模式双重锁 编辑:程序博客网 时间:2024/05/20 22:02

第K极值

我调了整整一个下午终于tmd过了,对自己的智商产生了严重的怀疑。

一开始写了一个40分的,跟正确答案只差一点估计是边界没搞好,我也懒得查了,先睡一觉再说吧,真烦。

40分的sort函数

int qsort(int l,int r){if(r==l)return a[l];int s=a[l];int p1=l+1,p2=r;    while(p1<p2)    {    while(a[p2]>=s&&p1<p2)    p2--;    while(a[p1]<=s&&p1<p2)    p1++;    if(p1<p2)    swap(a[p1],a[p2]);}swap(a[l],a[p1]);if(k>p1)return qsort(p1+1,r);else if(k<p1)return qsort(l,p1-1);    else if(k==p1)    return a[p1];}


等我睡醒了再查错好了。

之前一直没有手写过快排,对基准数的理解可能有些偏差,后来重新写了一遍才AC;

#include<iostream>#include<cmath>using namespace std;int a[1000001];int k;int qsort(int l,int r){if(l<r){int i=l,j=r,x=a[l];while(i<j){while(a[j]>=x&&i<j) j--;while(a[i]<=x&&i<j) i++;if(i<j)swap(a[i],a[j]);}a[l]=a[i];a[i]=x;if(k==i)return a[i];else if(k<i)return qsort(l,i-1);elsereturn qsort(i+1,r);}else return a[l];}int main(){int n;    cin>>n>>k;for(int i=1;i<=n;i++)cin>>a[i];int c=qsort(1,n);    k=n+1-k;    int d=qsort(1,n);    int ans=d-c;    if(ans<2){    cout<<"NO"<<endl;        cout<<ans<<endl;        return 0;    }    bool j=0;for(int i=2;i<=sqrt(ans);i++){if(ans%i==0){j=1;break;}}if(j==1)cout<<"NO"<<endl;else cout<<"YES"<<endl;cout<<ans<<endl;cout<<endl;return 0;}


竟然比直接排序还慢真可怕,不知道是我写错了还是数据量太小,题目说n<=10000感觉不至于吧,真烦。

—————————————————————————————————————————————————————————————————————————————

第一个代码得40分的原因是一开始p1=l+1了,应该p1=l 。

0 0
原创粉丝点击