题目描述
输入 nn(n<5000000n<5000000 且 nn 为奇数) 个数字 a_i(0<a_i<10^9)a
i
(0<a
i
<10
9
) ,输出这些数字的第 kk 小的数。最小的数是第 0 小。
输入格式
无
输出格式
无
分析:一开始想的是暴力,直接sort然后再去输出,TLE了。。。
只后我逐渐意识到这是一个局部排序问题,只要排出小于m部分即可。。。
因此有了快排的思想,在递归时用if控制一下(注意不是l到k或者时k到r,依旧从l到i-1遍历,i+1到r遍历)
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxn=5000005;
ll n,k,a[maxn];
void myswap(ll &a,ll &b)
{
ll t=a;
a=b;
b=t;
}
ll Partition(ll l,ll r)
{
ll i,j,temp;
i=l;
temp=a[r];
for(j=l;j<r;j++)
{
if(a[j]<temp)
{
myswap(a[i],a[j]);
i++;
}
}
myswap(a[i],a[r]);
return i;
}
void quicksort(ll l,ll r)
{
ll i;
if(l<r)
{
i=Partition(l,r);
if(k<i) quicksort(l,i-1);
else if(k>i) quicksort(i+1,r);
else return;
}
}
int main()
{
ll i;
scanf("%lld %lld",&n,&k);
for(i=0;i<n;i++) scanf("%lld",&a[i]);
quicksort(0,n-1);
cout<<a[k]<<endl;
return 0;
}