快速排序,找到第 K 个最大元素
每进行一次快速排序的 partFun操作,就能找到这次我们选中的基准值排序之后的正确位置。
如果它的位置刚好是排序之后第 K 个最大元素的位置,即 length - k,我们直接得到了答案;
因为进行 partition 操作之后,位于基准值之前的元素都要小于基准值,位于基准值之后的元素都要大于等于基准值。
- 如果它的位置小于排序之后第 K 个最大元素的位置,我们就去它之后寻找第 K 个最大元素;
- 如果它的位置大于排序之后第 K 个最大元素的位置,我们就去它之前寻找第 K 个最大元素;
const arr = [1,5,3,9,6,4,2];
function quickSort(arr, k,left, right) {
let tagIndex = arr.length - k;
let leftN, rightN, pivotIndex;
leftN = typeof left != 'number' ? 0 : left;
rightN = typeof right != 'number' ? arr.length - 1 : right;
if (leftN < rightN) {
pivotIndex = partFun(arr, leftN, rightN);
console.log(tagIndex,pivotIndex);
if(tagIndex == pivotIndex) {
console.log("找到了",tagIndex)
return arr[tagIndex]
}else if(tagIndex > pivotIndex) {
console.log('大于');
quickSort(arr,k, pivotIndex + 1, rightN);
}else {
console.log('小于');
quickSort(arr, k,leftN, pivotIndex - 1);
}
}
return arr[tagIndex];//一定不能漏,否则报错
}
function partFun(arr, left, right) {
let pivot = left;
let index = left + 1;
for (let i = index; i <= right; i++) {
if (arr[i] < arr[pivot]) {
swap(arr, i, index)
index++
}
}
swap(arr, pivot, index - 1)
return index - 1;
}
function swap(arr, i, j) {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
const arrN = quickSort(arr,3);
console.log(arrN);