import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param a int整型一维数组
* @param n int整型
* @param K int整型
* @return int整型
*/
public int findKth (int[] a, int n, int K) {
// write code here
// 1.先进行排序 - O(NlogN)
// 手写快排
// Arrays.sort(a);
quickSort(a);
// 2.直接取出第K大元素返回
return a[n - K];
}
// 快速排序主方法
public void quickSort(int[] a) {
if (a.length == 0 || a.length == 1) {
return;
}
process(a, 0, a.length - 1);
}
// 快速排序递归方法
public void process(int[] a, int l, int r) {
// 递归出口
if (l >= r) {
return;
}
// 先分区,再根据pivort的位置左右递归
int[] i = partition(a, l, r);
process(a, l, i[0]);
process(a, i[1], r);
}
// 快速排序分区方法
public int[] partition (int[] a, int l, int r) {
int p = a[l];
int smaller = l - 1;
int larger = r + 1;
int i = l;
while (i < larger) {
if (a[i] == p) {
// 当前值等于p,则直接掠过
i++;
} else if (a[i] < p) {
// 发现当前值比p更小,则与smaller的下一个位置交换,smaller自增,表示小于区右扩一位
// 同时i可以自增,因为从前面交换过来的元素要么等于p,要么是自己交换自己,无需再次比较
int t = a[i];
a[i] = a[smaller + 1];
a[smaller + 1] = t;
smaller++;
i++;
} else {
// 发现当前值比p更大,则与larger的前一个位置交换,larger自减,表示大于区左扩一位
// 此时i不能自增,因为从后面交换过来的元素不知道其与p的大小关系,需要再次比较
int t = a[i];
a[i] = a[larger - 1];
a[larger - 1] = t;
larger--;
}
}
int[] result = {smaller, larger};
return result;
}
}