(function (exports) { 'use strict'; function charCodeAt(str, i) { return (i < str.length) ? str.charCodeAt(i) : -1; } function sort(arr, lo, hi, d) { var temp = []; var count = []; var j; var idx; // Use Insertion sort when the // array is smaller than given threshold for (j = lo; j <= hi; j += 1) { idx = charCodeAt(arr[j], d) + 2; count[idx] = count[idx] || 0; count[idx] += 1; } for (j = 0; j < count.length - 1; j += 1) { count[j] = count[j] || 0; count[j + 1] = count[j + 1] || 0; count[j + 1] += count[j]; } for (j = lo; j <= hi; j += 1) { idx = charCodeAt(arr[j], d) + 1; temp[count[idx]] = arr[j]; count[idx] += 1; } for (j = lo; j <= hi; j += 1) { arr[j] = temp[j - lo]; } for (j = 0; j < count.length - 2; j += 1) { sort(arr, lo + count[j], lo + count[j + 1] - 1, d + 1); } } /** * Sorts given array lexicographically. * Algorithms knows how to treat * differently length strings.

* Algorithm is stable. * Time complexity: O(N*M) for N keys which have M or fewer digits. * * @example * * var sort = require('../src/sorting/msd').msd; * // [ 'aab', 'aaa', 'acc', 'bbb', 'bcc' ] * console.log(sort(['aab', 'bbb', 'aaa', 'acc', 'bcc'])); * * @public * @module sorting/msd * @param {Array} arr Array which should be sorted. * @param {Number} d Optional. Digit from which sorting should start. * @return {Array} Sorted array. */ function msd(arr, d) { d = d || 0; sort(arr, 0, arr.length - 1, d); return arr; } exports.msd = msd; })(typeof window === 'undefined' ? module.exports : window);