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; } }