运用快速排序的思想,可以达到线性时间找到一串数的第K大
#include<cstdio>
#define F(i,a,b) for(int i=a;i<=b;i++)
int a[1000],n;
void swap(int &a,int &b){int c=a;a=b,b=c;}
int partition(int *a,int l,int r){
int x=a[l],pos=l;
for(int i=l+1;i<=r;i++)
if(a[i]<x)swap(a[++pos],a[i]);
swap(a[l],a[pos]);
return pos;
}
int find_k(int *a,int k,int l=1,int r=n){
int pos=partition(a,l,r);
int j=pos-l+1;
if(l==r)return a[l];
if(k==j)return a[pos];
if(k>j)return find_k(a,k-j,pos+1,r);
else return find_k(a,k,l,pos-1);
}
double findmid(){
if(n&1){
int k=(n>>1)+1;
double ans=find_k(a,k);
return ans;
}else{
int k=n>>1;
double ans=find_k(a,k)+find_k(a,k+1);
return ans/2;
}
}
int main(){
scanf("%d",&n);
F(i,1,n)scanf("%d",a+i);
printf("mid=%lf\n",findmid());
return 0;
}