pax_global_header00006660000000000000000000000064132166774650014533gustar00rootroot0000000000000052 comment=631efe5734122190d480ba394bde96f5bcd70e3e quickselect-1.0.1/000077500000000000000000000000001321667746500140465ustar00rootroot00000000000000quickselect-1.0.1/.travis.yml000066400000000000000000000000601321667746500161530ustar00rootroot00000000000000language: node_js node_js: - "4" - "stable" quickselect-1.0.1/README.md000066400000000000000000000020611321667746500153240ustar00rootroot00000000000000## quickselect [![Build Status](https://travis-ci.org/mourner/quickselect.svg?branch=master)](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 ``` quickselect-1.0.1/bench.js000066400000000000000000000004571321667746500154710ustar00rootroot00000000000000'use strict'; var quickselect = require('./'); var N = 10000000; var arr = []; for (var i = 0; i < N; i++) arr.push(Math.random()); console.time('quickselect'); quickselect(arr, Math.floor(N / 2), 0, N - 1, function (a, b) { return a < b ? -1 : a > b ? 1 : 0; }); console.timeEnd('quickselect'); quickselect-1.0.1/index.js000066400000000000000000000030301321667746500155070ustar00rootroot00000000000000'use strict'; module.exports = quickselect; module.exports.default = quickselect; 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; } quickselect-1.0.1/package.json000066400000000000000000000010431321667746500163320ustar00rootroot00000000000000{ "name": "quickselect", "version": "1.0.1", "description": "A tiny and fast selection algorithm in JavaScript.", "main": "index.js", "dependencies": {}, "devDependencies": { "eslint": "^2.1.0", "eslint-config-mourner": "^2.0.0", "tape": "^4.4.0" }, "scripts": { "pretest": "eslint index.js test.js", "test": "tape test.js" }, "keywords": [ "selection", "algorithm", "quickselect", "sort", "partial", "floyd", "rivest" ], "author": "Vladimir Agafonkin", "license": "ISC" } quickselect-1.0.1/test.js000066400000000000000000000004751321667746500153710ustar00rootroot00000000000000'use strict'; var test = require('tape').test; var quickselect = require('./'); test('selection', function (t) { var arr = [65, 28, 59, 33, 21, 56, 22, 95, 50, 12, 90, 53, 28, 77, 39]; quickselect(arr, 8); t.deepEqual(arr, [39, 28, 28, 33, 21, 12, 22, 50, 53, 56, 59, 65, 90, 77, 95]); t.end(); });