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) 2018, 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 [](https://travis-ci.org/mourner/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
|
||||
var 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
|
||||
```
|
||||
54
node_modules/quickselect/index.js
generated
vendored
Normal file
54
node_modules/quickselect/index.js
generated
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
export default function quickselect(arr, k, left, right, compare) {
|
||||
quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
|
||||
}
|
||||
|
||||
function quickselectStep(arr, k, left, right, compare) {
|
||||
|
||||
while (right > left) {
|
||||
if (right - left > 600) {
|
||||
var n = right - left + 1;
|
||||
var m = k - left + 1;
|
||||
var z = Math.log(n);
|
||||
var s = 0.5 * Math.exp(2 * z / 3);
|
||||
var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
|
||||
var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
|
||||
var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
|
||||
quickselectStep(arr, k, newLeft, newRight, compare);
|
||||
}
|
||||
|
||||
var t = arr[k];
|
||||
var i = left;
|
||||
var 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;
|
||||
}
|
||||
}
|
||||
|
||||
function swap(arr, i, j) {
|
||||
var tmp = arr[i];
|
||||
arr[i] = arr[j];
|
||||
arr[j] = tmp;
|
||||
}
|
||||
|
||||
function defaultCompare(a, b) {
|
||||
return a < b ? -1 : a > b ? 1 : 0;
|
||||
}
|
||||
43
node_modules/quickselect/package.json
generated
vendored
Normal file
43
node_modules/quickselect/package.json
generated
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"name": "quickselect",
|
||||
"version": "2.0.0",
|
||||
"description": "A tiny and fast selection algorithm in JavaScript.",
|
||||
"module": "index.js",
|
||||
"main": "quickselect.js",
|
||||
"dependencies": {},
|
||||
"devDependencies": {
|
||||
"eslint": "^4.19.1",
|
||||
"eslint-config-mourner": "^2.0.3",
|
||||
"esm": "^3.0.15",
|
||||
"rollup": "^0.57.1",
|
||||
"tape": "^4.9.0"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": "mourner",
|
||||
"parserOptions": {
|
||||
"sourceType": "module"
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"pretest": "eslint index.js test.js bench.js",
|
||||
"test": "node -r esm test.js",
|
||||
"bench": "node -r esm bench.js",
|
||||
"build": "rollup -c",
|
||||
"prepublishOnly": "npm run build"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"quickselect.js"
|
||||
],
|
||||
"keywords": [
|
||||
"selection",
|
||||
"algorithm",
|
||||
"quickselect",
|
||||
"sort",
|
||||
"partial",
|
||||
"floyd",
|
||||
"rivest"
|
||||
],
|
||||
"author": "Vladimir Agafonkin",
|
||||
"license": "ISC"
|
||||
}
|
||||
63
node_modules/quickselect/quickselect.js
generated
vendored
Normal file
63
node_modules/quickselect/quickselect.js
generated
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
(function (global, factory) {
|
||||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
||||
typeof define === 'function' && define.amd ? define(factory) :
|
||||
(global.quickselect = factory());
|
||||
}(this, (function () { 'use strict';
|
||||
|
||||
function quickselect(arr, k, left, right, compare) {
|
||||
quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
|
||||
}
|
||||
|
||||
function quickselectStep(arr, k, left, right, compare) {
|
||||
|
||||
while (right > left) {
|
||||
if (right - left > 600) {
|
||||
var n = right - left + 1;
|
||||
var m = k - left + 1;
|
||||
var z = Math.log(n);
|
||||
var s = 0.5 * Math.exp(2 * z / 3);
|
||||
var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
|
||||
var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
|
||||
var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
|
||||
quickselectStep(arr, k, newLeft, newRight, compare);
|
||||
}
|
||||
|
||||
var t = arr[k];
|
||||
var i = left;
|
||||
var 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;
|
||||
}
|
||||
}
|
||||
|
||||
function swap(arr, i, j) {
|
||||
var tmp = arr[i];
|
||||
arr[i] = arr[j];
|
||||
arr[j] = tmp;
|
||||
}
|
||||
|
||||
function defaultCompare(a, b) {
|
||||
return a < b ? -1 : a > b ? 1 : 0;
|
||||
}
|
||||
|
||||
return quickselect;
|
||||
|
||||
})));
|
||||
Reference in New Issue
Block a user