Initial commit
This commit is contained in:
15
node_modules/quickselect/LICENSE
generated
vendored
Normal file
15
node_modules/quickselect/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
ISC License
|
||||
|
||||
Copyright (c) 2024, Vladimir Agafonkin
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any purpose
|
||||
with or without fee is hereby granted, provided that the above copyright notice
|
||||
and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
||||
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
||||
THIS SOFTWARE.
|
||||
28
node_modules/quickselect/README.md
generated
vendored
Normal file
28
node_modules/quickselect/README.md
generated
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
## quickselect
|
||||
|
||||
A tiny and fast [selection algorithm](https://en.wikipedia.org/wiki/Selection_algorithm) in JavaScript
|
||||
(specifically, [Floyd-Rivest selection](https://en.wikipedia.org/wiki/Floyd%E2%80%93Rivest_algorithm)).
|
||||
|
||||
```js
|
||||
quickselect(array, k[, left, right, compareFn]);
|
||||
```
|
||||
|
||||
Rearranges items so that all items in the `[left, k]` are the smallest.
|
||||
The `k`-th element will have the `(k - left + 1)`-th smallest value in `[left, right]`.
|
||||
|
||||
- `array`: the array to partially sort (in place)
|
||||
- `k`: middle index for partial sorting (as defined above)
|
||||
- `left`: left index of the range to sort (`0` by default)
|
||||
- `right`: right index (last index of the array by default)
|
||||
- `compareFn`: compare function
|
||||
|
||||
Example:
|
||||
|
||||
```js
|
||||
const arr = [65, 28, 59, 33, 21, 56, 22, 95, 50, 12, 90, 53, 28, 77, 39];
|
||||
|
||||
quickselect(arr, 8);
|
||||
|
||||
// arr is [39, 28, 28, 33, 21, 12, 22, 50, 53, 56, 59, 65, 90, 77, 95]
|
||||
// ^^ middle index
|
||||
```
|
||||
12
node_modules/quickselect/index.d.ts
generated
vendored
Normal file
12
node_modules/quickselect/index.d.ts
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
/**
|
||||
* Rearranges items so that all items in the [left, k] are the smallest.
|
||||
* The k-th element will have the (k - left + 1)-th smallest value in [left, right].
|
||||
*
|
||||
* @template T
|
||||
* @param {T[]} arr the array to partially sort (in place)
|
||||
* @param {number} k middle index for partial sorting (as defined above)
|
||||
* @param {number} [left=0] left index of the range to sort
|
||||
* @param {number} [right=arr.length-1] right index
|
||||
* @param {(a: T, b: T) => number} [compare = (a, b) => a - b] compare function
|
||||
*/
|
||||
export default function quickselect<T>(arr: T[], k: number, left?: number | undefined, right?: number | undefined, compare?: ((a: T, b: T) => number) | undefined): void;
|
||||
74
node_modules/quickselect/index.js
generated
vendored
Normal file
74
node_modules/quickselect/index.js
generated
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
|
||||
/**
|
||||
* Rearranges items so that all items in the [left, k] are the smallest.
|
||||
* The k-th element will have the (k - left + 1)-th smallest value in [left, right].
|
||||
*
|
||||
* @template T
|
||||
* @param {T[]} arr the array to partially sort (in place)
|
||||
* @param {number} k middle index for partial sorting (as defined above)
|
||||
* @param {number} [left=0] left index of the range to sort
|
||||
* @param {number} [right=arr.length-1] right index
|
||||
* @param {(a: T, b: T) => number} [compare = (a, b) => a - b] compare function
|
||||
*/
|
||||
export default function quickselect(arr, k, left = 0, right = arr.length - 1, compare = defaultCompare) {
|
||||
|
||||
while (right > left) {
|
||||
if (right - left > 600) {
|
||||
const n = right - left + 1;
|
||||
const m = k - left + 1;
|
||||
const z = Math.log(n);
|
||||
const s = 0.5 * Math.exp(2 * z / 3);
|
||||
const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
|
||||
const newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
|
||||
const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
|
||||
quickselect(arr, k, newLeft, newRight, compare);
|
||||
}
|
||||
|
||||
const t = arr[k];
|
||||
let i = left;
|
||||
/** @type {number} */
|
||||
let j = right;
|
||||
|
||||
swap(arr, left, k);
|
||||
if (compare(arr[right], t) > 0) swap(arr, left, right);
|
||||
|
||||
while (i < j) {
|
||||
swap(arr, i, j);
|
||||
i++;
|
||||
j--;
|
||||
while (compare(arr[i], t) < 0) i++;
|
||||
while (compare(arr[j], t) > 0) j--;
|
||||
}
|
||||
|
||||
if (compare(arr[left], t) === 0) swap(arr, left, j);
|
||||
else {
|
||||
j++;
|
||||
swap(arr, j, right);
|
||||
}
|
||||
|
||||
if (j <= k) left = j + 1;
|
||||
if (k <= j) right = j - 1;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @template T
|
||||
* @param {T[]} arr
|
||||
* @param {number} i
|
||||
* @param {number} j
|
||||
*/
|
||||
function swap(arr, i, j) {
|
||||
const tmp = arr[i];
|
||||
arr[i] = arr[j];
|
||||
arr[j] = tmp;
|
||||
}
|
||||
|
||||
/**
|
||||
* @template T
|
||||
* @param {T} a
|
||||
* @param {T} b
|
||||
* @returns {number}
|
||||
*/
|
||||
function defaultCompare(a, b) {
|
||||
return a < b ? -1 : a > b ? 1 : 0;
|
||||
}
|
||||
39
node_modules/quickselect/package.json
generated
vendored
Normal file
39
node_modules/quickselect/package.json
generated
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
{
|
||||
"name": "quickselect",
|
||||
"version": "3.0.0",
|
||||
"type": "module",
|
||||
"description": "A tiny and fast selection algorithm in JavaScript.",
|
||||
"repository": "github:mourner/quickselect",
|
||||
"module": "index.js",
|
||||
"main": "index.js",
|
||||
"exports": "./index.js",
|
||||
"devDependencies": {
|
||||
"eslint": "^9.6.0",
|
||||
"eslint-config-mourner": "^4.0.1",
|
||||
"esm": "^3.2.25",
|
||||
"rollup": "^4.18.0",
|
||||
"tape": "^5.8.1",
|
||||
"typescript": "^5.5.3"
|
||||
},
|
||||
"scripts": {
|
||||
"pretest": "eslint *.js && tsc",
|
||||
"test": "node test.js",
|
||||
"bench": "node bench.js"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"index.d.ts"
|
||||
],
|
||||
"types": "index.d.ts",
|
||||
"keywords": [
|
||||
"selection",
|
||||
"algorithm",
|
||||
"quickselect",
|
||||
"sort",
|
||||
"partial",
|
||||
"floyd",
|
||||
"rivest"
|
||||
],
|
||||
"author": "Vladimir Agafonkin",
|
||||
"license": "ISC"
|
||||
}
|
||||
Reference in New Issue
Block a user