@extra-array/selection-sort
Version:
Arranges values in an order.
59 lines (54 loc) • 1.27 kB
JavaScript
/**
* 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);
}
function selectionSortPair$(x, fc, m) {
var X = x.length, diff = x !== m;
for (var i = 0; i < X - 1; i++) {
var l = i;
for (var j = i + 1; j < X; j++)
if (fc(m[l], m[j]) > 0)
l = j;
{
var t = x[i];
x[i] = x[l];
x[l] = t;
}
if (diff) {
var u = m[i];
m[i] = m[l];
m[l] = u;
}
}
return x;
}
/**
* Arranges values in an order.
* @param x an array (updated)
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
* @returns x
*/
function selectionSort$(x, fc = null, fm = null) {
var fc = fc || cmp;
if (fm)
return selectionSortPair$(x, fc, x.map(fm));
else
return selectionSortPair$(x, fc, x);
}
/**
* Arranges values in an order.
* @param x an array
* @param fc compare function (a, b)
* @param fm map function (v, i, x)
*/
function selectionSort(x, fc = null, fm = null) {
return selectionSort$(x.slice(), fc, fm);
}
module.exports = selectionSort;
;