feat: 快速排序的应用,topk问题
This commit is contained in:
parent
495acd3709
commit
00f6a80ab1
53
sort/practice.mjs
Normal file
53
sort/practice.mjs
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param {number[]} arr - 需要操作的数组
|
||||||
|
* @param {number} k - 需要找的多少个数
|
||||||
|
*/
|
||||||
|
function topK(arr, k) {
|
||||||
|
if (k > arr.length) {
|
||||||
|
throw new Error(`数组的长度必须大于${k}`);
|
||||||
|
}
|
||||||
|
let low = 0;
|
||||||
|
let high = arr.length - 1;
|
||||||
|
let pivot = partition(arr, low, high);
|
||||||
|
while (pivot !== k - 1) { // 如果k等于pivot-1说明就找到了
|
||||||
|
if (pivot > k - 1) {
|
||||||
|
high = pivot - 1;
|
||||||
|
pivot = partition(arr, low, high);
|
||||||
|
}
|
||||||
|
if (pivot < k - 1) {
|
||||||
|
low = pivot + 1;
|
||||||
|
pivot = partition(arr, low, high);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return arr.slice(0, k);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 使用经典的挖坑法
|
||||||
|
* @param {number[]} 要分解的数组
|
||||||
|
* @param {*} low 开始下标
|
||||||
|
* @param {*} high 结束下标
|
||||||
|
*/
|
||||||
|
function partition(arr, low, high) {
|
||||||
|
const pivot = arr[high]; // 默认以最后一个数为枢纽
|
||||||
|
while (low < high) {
|
||||||
|
// low找比pivot大的数
|
||||||
|
while (low < high && arr[low] < pivot) {
|
||||||
|
low++;
|
||||||
|
}
|
||||||
|
arr[high] = arr[low];
|
||||||
|
while (low < high && arr[high] > pivot) {
|
||||||
|
high--;
|
||||||
|
}
|
||||||
|
arr[low] = arr[high];
|
||||||
|
}
|
||||||
|
arr[low] = pivot;
|
||||||
|
return low;
|
||||||
|
}
|
||||||
|
|
||||||
|
// test
|
||||||
|
|
||||||
|
const arr = [11, 9, 6, 17, 0, 1, 2, 18, 3, 4, 8, 5];
|
||||||
|
const ret = topK(arr, 100);
|
||||||
|
console.log(ret);
|
Loading…
x
Reference in New Issue
Block a user