思路:
向目标方向递归,复杂度比n*log(n)略低
过程同快排:
(1)终止条件:l == r
(2)分解为子问题
(3)具体向哪个方向递归,取决于k在j左边还是右边
代码:
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int quick_select(int a[],int l,int r,int k)
{
if(l == r) return a[l];
int x = a[l + r >> 1],i = l - 1,j = r + 1;
while(i < j)
{
do i ++;while(a[i] < x);
do j --; while(a[j] > x);
if(i < j) swap(a[i],a[j]);
}
if(k <= j) return quick_select(a,l,j,k);
else return quick_select(a,j + 1,r,k);
}
int main()
{
int n,k;
cin >> n >> k;
for(int i = 1;i <= n;i ++) cin >> a[i];
cout << quick_select(a,1,n,k);
return 0;
}