因为是找第x大的数,所以是从大到小排列的
/**/
#include<stdio.h>
int a[100010];
int once(int l,int r)
{
int k=a[l];//以下称k为关键数(进行排序的数轴)
while(l<r)//(注意快排时是从右边界开始排序的)
{
while(l<r&&k>=a[r])//若关键数比后面的数大,继续向前比较(从大到小排)
r--;
a[l]=a[r];
while(l<r&&k<=a[l])//关键数比前面的数小,继续向后比较
l++;
a[r]=a[l];
}
a[l]=k;
return l;
}
//通过一次快排后,关键数前面的数大于关键数,后面的数小于关键数,即已经找到了第l大的数
void qsort(int l,int r,int k)
{
int m;
if(l<r)
{
m=once(l,r);
if(m==k)
return ;
else if(m>k)
{
qsort(l,m-1,k);
}
else
qsort(m+1,r,k);
}
}
int main()
{
int i,n,m,k;
while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
while(m--)
{
scanf("%d",&k);
qsort(1,n,k);
printf("%d\n",a[k]);
}
}
return 0;
}
/*第k小的数*/
#include<stdio.h>
int a[900010];
int once(int l,int r)//快排是从小到大进行排序,其余和寻找第m大的数相同
{
int k=a[l];
while(l<r)
{
while(l<r&&k<=a[r])
r--;
a[l]=a[r];
while(l<r&&k>=a[l])
l++;
a[r]=a[l];
}
a[l]=k;
return l;
}
void qsort(int l,int r,int k)
{
int m;
if(l<r)
{
m=once(l,r);
if(m==k)
return ;
else if(m>k)
{
qsort(l,m-1,k);
}
else
qsort(m+1,r,k);
}
}
int main()
{
int i,t,n,k;
while(~scanf("%d",&t))
{
while(t--)
{
scanf("%d %d",&n,&k);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
qsort(1,n,k);
printf("%d\n",a[k]);
}
}
return 0;
}
上面的once和qsort两个函数可以用下面一个代替
void qsort(int l,int r)//从小往大排序
{
int i,j,k;
i=l;
j=r;
if(i>=j)
return ;
else
{
k=a[i];
while(i<j)
{
while(i<j&&k<=a[j])
j--;
a[i]=a[j];
while(i<j&&k>=a[i])
i++;
a[j]=a[i];
}
k=a[i];
}
qsort(l,i-1);
qsort(i+1,r);
}