import java.util.*;
/**
 快速排序思路,每次找一个值,确定这个值在最终排序数组中的最终位置!
 **/
public class Solution {
    // 直接排序也能达到时间复杂度O(nlogn)
    public int findKth(int[] arr, int n, int k) {
        return quickSort(arr,0,n-1,k);
    }

    // 二分查找!
    private int quickSort(int[] arr,int from,int to,int k){
        int index = partion(arr,from,to);
        if(k == index - from + 1) return arr[index];
        if(index - from + 1 > k) // 在左边!
            return quickSort(arr,from,index - 1,k);
        // 在右边!
        return quickSort(arr,index + 1,to,k-(index - from + 1));
    }



    // 返回这个数在有序区间的位置!
    private int partion(int[] arr,int from,int to){
        int lt = from,rt = to;
        int pivot = arr[from];
        while(lt < rt){
            while(lt < rt && arr[rt] <= pivot){
                rt--;
            }
            arr[lt] = arr[rt];

            while(lt < rt && arr[lt] >= pivot){
                lt++;
            }
            arr[rt] = arr[lt];
        }
        // lt == rt
        arr[lt] = pivot;
        return lt;
    }
}