Source code

Revision control

Copy as Markdown

Other Tools

function comparer(a, b) {
const ma = /.(\d+)\W*$/.exec(a);
const mb = /.(\d+)\W*$/.exec(b);
if (ma == null || mb == null || ma[1] == mb[1]) {
return a < b ? -1 : a > b ? 1 : 0;
} else {
const na = +ma[1],
nb = +mb[1];
return na < nb ? -1 : na > nb ? 1 : 0;
}
}
function binaryLookup(ar, i, comparer) {
if (ar.length == 0) {
return { found: false, index: 0 };
}
let l = 0,
r = ar.length - 1;
while (l < r) {
const mid = Math.floor((l + r) / 2);
if (comparer(ar[mid], i) < 0) {
l = mid + 1;
} else {
r = mid;
}
}
const result = comparer(ar[l], i);
if (result === 0) {
return { found: true, index: l };
}
return {
found: false,
index: result < 0 ? l + 1 : l
};
}
export function fancySort(input) {
return input.reduce((ar, i) => {
const { index } = binaryLookup(ar, i, comparer);
ar.splice(index, 0, i);
return ar;
}, []);
}