Acwing 4782. 第k个数(快排) Java
🤠 原题链接
🤠 快速排序+选择性递归
🤠 O( 2n )
import java.util.*;
class Main{
static int N = 1010;
static int[] q = new int[N];
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
for(int i =0; i < n; i++)
q[i] = sc.nextInt();
System.out.println(quickSort(0,n-1,k));
}
static int quickSort(int l,int r,int k){
if(l==r) return q[l];//递归出口
int x = q[l];//分界点
int i = l-1;//左边界
int j = r+1;//右边界
// 快速排序
while(i<j){
while(q[++i]<x);//从左到右找到一个大于 x 的数
while(q[--j]>x);//从右到左找到一个小于 x 的数
if(i<j){
int t = q[i];
q[i] = q[j];
q[j] = t;
}
}
int sl = j-l+1;//左边区间的长度
if(k <= sl)
return quickSort(l,j,k);//递归左区间
return quickSort(j+1,r,k-sl);//递归右区间
}
}

浙公网安备 33010602011771号