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);//递归右区间
        
    }
}
posted @ 2023-02-20 10:25  兑生  阅读(18)  评论(0)    收藏  举报  来源
Live2D