数据貌似很弱的样子,冒泡也可以过,用线性时间查找第k个数,0ms过。
#include<stdio.h>
#include<stdlib.h>
#define MAXD 10010
int N,a[MAXD];
int partition(int a[],int p,int r)
{
int x=a[r];
int i=p-1;
int j,t;
for(j=p;j<r;j++)
{
if(a[j]<=x)
{
i++;
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
t=a[i+1];
a[i+1]=a[r];
a[r]=t;
return i+1;
}
int randomized_partition(int a[],int p,int r)
{
int i=(rand()%(r-p+1))+p;
int t=a[r];
a[r]=a[i];
a[i]=t;
return partition(a,p,r);
}
int randomized_select(int a[],int p,int r,int i)
{
if(p==r)
return a[p];
int q=randomized_partition(a,p,r);
int k=q-p+1;
if(i==k)
return a[q];
else
{
if(i<k)
return randomized_select(a,p,q-1,i);
else
return randomized_select(a,q+1,r,i-k);
}
}
int main()
{
//freopen("test.txt","r",stdin);
scanf("%d",&N);
int i;
for(i=1;i<=N;i++)
{
scanf("%d",&a[i]);
}
int ans=randomized_select(a,1,N,(N+1)/2);
printf("%d\n",ans);
return 0;
}