1、快排递归解法:

import java.util.*;

public class Finder {
    public int findKth(int[] a, int n, int K) {
        // write code here
        //快排思路
        //找一个基数,大于基数的放左边,小于基数的放另右边
        //看基数的位置,如果基数的索引位置大于k说明k位于左边区间,否则位于右边区间
        //二分递归,直到 基数的位置等于k-1
        return quickSort(a,0,n-1,K-1); 
    }
    public int quickSort(int[] arr,int begin,int end,int k){
        //中轴线取左侧第一个元素
        int b = begin;
        int e = end;
        int pivot = arr[begin];
        while(begin<end){
            //找右边大于中轴线的元素
            while(begin<end&&arr[end]<=pivot){
                end--;
            }
            //右侧移到中轴线的左侧
            arr[begin] = arr[end];
            //找左侧小于中轴线的元素
            while(begin<end&&arr[begin]>=pivot){
                begin++;
            }
            //左侧移到中轴线的右侧
            arr[end] = arr[begin];
        }
        arr[begin] = pivot;

        if(begin==k){
            return arr[begin];
        }else if(begin>k){
            //k在左侧区间
            return quickSort(arr,b,begin-1,k);
        }else{
            //k 在右侧区间
            return quickSort(arr,begin+1,e,k);
        }   
    } 
}

2、快排非递归解法:

import java.util.*;

public class Finder {
    public int findKth(int[] a, int n, int K) {
        // write code here
        //快排思路 非递归解法
        //找一个基数,大于基数的放左边,小于基数的放另右边
        //看基数的位置,如果基数的索引位置大于k说明k位于左边区间,否则位于右边区间
        //重置begin和end的位置,继续循环,直到 中轴线位置 pivot==k-1
        return quickSort(a,0,n-1,K-1);   
    }

    public int quickSort(int[] arr,int begin,int end,int k){
        //中轴线取左侧第一个元素
        while(true){
            int b = begin;
            int e = end;
            int pivot = arr[begin];
            while(begin<end){
                //找右边大于中轴线的元素
                while(begin<end&&arr[end]<=pivot){
                    end--;
                }
                //右侧移到中轴线的左侧
                arr[begin] = arr[end];
                //找左侧小于中轴线的元素
                while(begin<end&&arr[begin]>=pivot){
                    begin++;
                }
                //左侧移到中轴线的右侧
                arr[end] = arr[begin];
            }
            arr[begin] = pivot;
            if(begin==k){
                break;
            }else if(begin>k){
                //k在左侧区间
                end = begin-1;
                begin = b;
                continue;
            }else{
                //k 在右侧区间
                begin = begin+1;
                end = e;
                continue;
            }
        }
        return arr[begin]; 
    }   
}