假设数组有序[1,2,3,4,5] 第k大的元素就是下标为(n=5) n-k的元素,只需要在数据中返回n-k 下标的元素即可。
利用快排的思路,可以得到以下代码
public int findKth(int[] a, int n, int K) {
return dfs(a, n, (n - K), 0, n - 1);
}
public int dfs(int[] a, int n, int K, int start, int end) {
int pIdx = partition(a, n, K, start, end);
if ((pIdx - start) == K) {
return a[pIdx];
}
if ((pIdx - start) < K) {
return dfs(a, n, (K - (pIdx - start + 1)), pIdx + 1, end);
} else {
return dfs(a, n, K, start, pIdx);
}
}
int partition(int[] a, int n, int K, int start, int end) {
int pv = a[start];
int left = start;
int right = end;
while (left < right) {
while (right > left && a[right] >= pv) {
right--;
}
if (left == right) {
break;
}
a[left] = a[right];
left++;
while (left < right && a[left] < pv) {
left++;
}
a[right] = a[left];
right--;
}
a[left] = pv; //right==left
return left;
}