@extra-array/bsearch-right
Version:
Binary searches rightmost value in sorted array.
46 lines (41 loc) • 980 B
JavaScript
;
/**
* Gives same value.
* @param v a value
* @returns v
*/
function id(v) {
return v;
}
/**
* Compares two values.
* @param a a value
* @param b another value
* @returns a<b: -1, a=b: 0, a>b: 1
*/
function cmp(a, b) {
return a < b ? -1 : (a > b ? 1 : 0);
}
/**
* Binary searches rightmost value in sorted array.
* @param x an array (sorted)
* @param v search value
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns last index of value | ~(index of closest value)
*/
function bsearchRight(x, v, fc = null, fm = null) {
var fc = fc || cmp, fm = fm || id;
var v1 = fm(v, 0, null);
for (var i = 0, I = x.length; i < I;) {
var m = i + I >>> 1;
var u1 = fm(x[m], m, x);
var c = fc(u1, v1);
if (c <= 0)
i = m + 1;
else
I = m;
}
return i <= 0 || fc(fm(x[i - 1], i - 1, x), v1) !== 0 ? ~i : i - 1;
}
module.exports = bsearchRight;