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);
}
}

浙公网安备 33010602011771号