基于快速排序的选择方法,只要某次划分的 基准pivot 为倒数第 k个下标的时候,我们就已经找到了答案。 我们只关心这一点,至于a[l⋯q−1] 和 a[q+1⋯r] 是否是有序的,我们不关心。
function findKth( a , n , K ) {
return quickfind(a,0,n-1,K)
}
function quickfind(a, left, right, k) {
let i = left, j = right, pivot = a[left];
while (i < j) {
while (i < j && a[j] >= pivot) j--;
if (i < j){
a[i] = a[j];
i++;
}
while (i < j && a[i] <= pivot) i++;
if (i < j){
a[j] = a[i];
j--;
}
}
a[i] = pivot;
const deltaK = k - right + i - 1;
if (deltaK === 0) return pivot;
else if (deltaK > 0) return quickfind(a, left, i - 1, deltaK);
else return quickfind(a, i + 1, right, k);
}
console.log(findKth([1,3,5,2,2],5,3));