【排序】第K大数

前言

一开始本来想做五千万的数据,然后因为洛谷的数据限制不得不降低了数据范围,但仍然只有 O ( n ) 能过

链接

https://www.luogu.org/problemnew/show/U20789

大意

求第 k 大数

思路

改进快速排序

代码

#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));//输出
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/80515226
今日推荐