import java.util.*;
public class Solution { public int findKth(int[] a, int n, int K) { // 快速排序,要求时间复杂度 O(nlogn),空间复杂度 O(1) // 向findKth的重载方法中传入第K大元素的索引n-K return findKth(a,0,n-1,n-K); } public int findKth(int[] a,int low,int high,int KIndex){
int pivot = a[low]; //取待排部分的第一个元素为枢轴值
int i = low;
int j = high;
//一趟快速排序
while (i < j) {
while (a[j] >= pivot && i < j) {
j--;
}
while (a[i] <= pivot && i < j) {
i++;
}
if (i < j) {
int temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
a[low] = a[j];
a[j] = pivot;
if (j == KIndex) {
return a[j];
}else if (j > KIndex){
return findKth(a,low,j-1,KIndex);
}else {
return findKth(a,j+1,high,KIndex);
}
}
}
// import java.util.*;
// public class Solution { // public int findKth(int[] a, int n, int K) { // // write code here // int des = quicksort(a,0,n-1); // int temp = n - des; // if(temp == K) { // return a[des]; // }else if() // return find(a,0,n-1,K); // } // public int quicksort(int[] a,int left,int right){ // int mid = left++; // while(left < right){ // while(a[left+1] < a[mid]) left ++; // while(a[right] > a[mid]) right--; // int temp = a[left]; // a[left] = a[right]; // a[right] = temp; // left ++; // right --; // } // int temp = a[mid]; // a[mid] = a[right]; // a[right] = temp; // return right; // } // // public int find(int[] a,int left,int right,int K){ // // int m = left+1; // // int n = right; // // int mid = left; // // while(m < n){ // // while(a[m] < a[mid]) m ++; // // while(a[n] >= a[mid])n --; // // if(m < n){ // // int temp = a[m]; // // a[m] = a[n]; // // a[n] = temp; // // m++; // // n--; // // }else{ // // int temp = a[mid]; // // a[mid] = a[n]; // // a[n] = temp; // // mid = n; // // } // // }
// // if(K - (right - mid + 1) == 0 ){ // // return a[mid]; // // } else if(K - (right - mid + 1) > 0){ // // find(a,left,mid - 1,K - (right - mid + 1)); // // }else { // // find(a,mid+1,right,K); // // } // // return a[mid]; // // } // }