algorithmpool
Version:
A pool of algorithms and data-structures for geeks
42 lines (41 loc) • 1.01 kB
JavaScript
import {
biggerEquals,
Compare,
defaultCompare,
defaultEquals,
defaultDiff,
DOES_NOT_EXIST,
lesserEquals
} from '../../utils/util';
export const interpolationSearch =(
array,
value,
compareFn = defaultCompare,
equalsFn = defaultEquals,
diffFn = defaultDiff
) => {
const {
length
} = array;
let low = 0;
let high = length - 1;
let position = -1;
let delta = -1;
while (
low <= high &&
biggerEquals(value, array[low], compareFn) &&
lesserEquals(value, array[high], compareFn)
) {
delta = diffFn(value, array[low]) / diffFn(array[high], array[low]);
position = low + Math.floor((high - low) * delta);
if (equalsFn(array[position], value)) {
return position;
}
if (compareFn(array[position], value) === Compare.LESS_THAN) {
low = position + 1;
} else {
high = position - 1;
}
}
return DOES_NOT_EXIST;
}