20200806 快速排序

模板

#include <bits/stdc++.h>

#define RG register int
#define rep(i,a,b)    for(RG i=a;i<=b;++i)
#define per(i,a,b)    for(RG i=a;i>=b;--i)
#define ll long long
#define inf (1<<29)
#define make_pair mp
const int maxn=5e6+5;
using namespace std;

inline int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}

int a[maxn],k;
void qsort(int p,int q){
    int i=p,j=q;
    int mid=a[(p+q)/2];
    do
    {
        while(a[i]<mid)i++;
        while(a[j]>mid)j--;
        if(i<=j){swap(a[i],a[j]);i++;j--;}
    }while(i<=j);
    if(i<q) qsort(i,q);
    if(j>p) qsort(p,j);
}

int main()
{
    int n=read(),sum=0;
    k=read();
    rep(i,0,k-1)
    {
        a[i]=read();
    }
//    nth_element(a+1,a+k+1,a+n+1);
    random_shuffle(a,a+k);
    qsort(0,k-1);
    //cout<<a[k+1];
    rep(i,0,k-1)cout<<a[i]<<' ';
    return 0;
}

 

求第k大的数

    • nth_element()           
      nth_element(a,a+n,a+k)
    • sort快排(凭啥这么快!)

小声哔哔:这题目居然不考虑相同的数字,简直了

===================================分割线===================================

void qsort(int l,int r)
{
    int i=l,j=r,mid=x[(l+r)/2];
    do
    {
        while(x[j]>mid)
            j--;
        while(x[i]<mid)
            i++;
        if(i<=j)
        {
            swap(x[i],x[j]);
            i++;
            j--;
        }
    }
    while(i<=j);
    //快排后数组被划分为三块: l<=j<=i<=r
    if(k<=j) qsort(l,j);//在左区间只需要搜左区间
    else if(i<=k) qsort(i,r);//在右区间只需要搜右区间
    else //如果在中间区间直接输出
    {
        printf("%d",x[j+1]);
        exit(0);
    }
}

  

 

posted @ 2020-08-06 17:43  Tabshh  阅读(123)  评论(0)    收藏  举报