前言
一开始本来想做五千万的数据,然后因为洛谷的数据限制不得不降低了数据范围,但仍然只有 O(n) O ( n ) 能过
链接
https://www.luogu.org/problemnew/show/U20789
大意
求第 k k <script type="math/tex" id="MathJax-Element-2">k</script>大数
思路
改进快速排序
代码
#include<cstdio>
#define swap(a,b) {a^=b;b=a^b;a^=b;}
using namespace std;
int n,a[5000001],k,ans,f;
char c;
int read()//输入流
{
f=0;
while((c=getchar())<=47||c>=58);f=(f<<3)+(f<<1)+c-48;
while((c=getchar())>=48&&c<=57) f=(f<<3)+(f<<1)+c-48;
return f;
};
int qsort(int l,int r)//改进快排
{
if(l==r) return a[l];//已近找到
if(l>r) return 0;
int i=l,j=r,x=a[l];
while(i<j)
{
while(i<j&&a[j]<x) j--;
if(i<j) a[i++]=a[j];
while(i<j&&a[i]>x) i++;
if(i<j) a[j--]=a[i];
}
a[i]=x;
if(i==k) return a[i];
if(i<k) return qsort(i+1,r);//左边
else return qsort(l,i-1);//右边
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) a[i]=read();
printf("%d",qsort(1,n));//输出
}