quickselect
Advanced tools
Comparing version 2.0.0 to 3.0.0
54
index.js
export default function quickselect(arr, k, left, right, compare) { | ||
quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare); | ||
} | ||
/** | ||
* 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) { | ||
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); | ||
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); | ||
} | ||
var t = arr[k]; | ||
var i = left; | ||
var j = right; | ||
const t = arr[k]; | ||
let i = left; | ||
/** @type {number} */ | ||
let j = right; | ||
@@ -46,4 +54,10 @@ swap(arr, left, k); | ||
/** | ||
* @template T | ||
* @param {T[]} arr | ||
* @param {number} i | ||
* @param {number} j | ||
*/ | ||
function swap(arr, i, j) { | ||
var tmp = arr[i]; | ||
const tmp = arr[i]; | ||
arr[i] = arr[j]; | ||
@@ -53,4 +67,10 @@ 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; | ||
} |
{ | ||
"name": "quickselect", | ||
"version": "2.0.0", | ||
"version": "3.0.0", | ||
"type": "module", | ||
"description": "A tiny and fast selection algorithm in JavaScript.", | ||
"repository": "github:mourner/quickselect", | ||
"module": "index.js", | ||
"main": "quickselect.js", | ||
"dependencies": {}, | ||
"main": "index.js", | ||
"exports": "./index.js", | ||
"devDependencies": { | ||
"eslint": "^4.19.1", | ||
"eslint-config-mourner": "^2.0.3", | ||
"esm": "^3.0.15", | ||
"rollup": "^0.57.1", | ||
"tape": "^4.9.0" | ||
"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" | ||
}, | ||
"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" | ||
"pretest": "eslint *.js && tsc", | ||
"test": "node test.js", | ||
"bench": "node bench.js" | ||
}, | ||
"files": [ | ||
"index.js", | ||
"quickselect.js" | ||
"index.d.ts" | ||
], | ||
"types": "index.d.ts", | ||
"keywords": [ | ||
@@ -33,0 +29,0 @@ "selection", |
@@ -1,2 +0,2 @@ | ||
## quickselect [![Build Status](https://travis-ci.org/mourner/quickselect.svg?branch=master)](https://travis-ci.org/mourner/quickselect) | ||
## quickselect | ||
@@ -22,3 +22,3 @@ A tiny and fast [selection algorithm](https://en.wikipedia.org/wiki/Selection_algorithm) in JavaScript | ||
```js | ||
var arr = [65, 28, 59, 33, 21, 56, 22, 95, 50, 12, 90, 53, 28, 77, 39]; | ||
const arr = [65, 28, 59, 33, 21, 56, 22, 95, 50, 12, 90, 53, 28, 77, 39]; | ||
@@ -25,0 +25,0 @@ quickselect(arr, 8); |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No repository
Supply chain riskPackage does not have a linked source code repository. Without this field, a package will have no reference to the location of the source code use to generate the package.
Found 1 instance in 1 package
Yes
5287
6
77