(function (exports) {
'use strict';
var bucketSort = (function () {
/**
* Insertionsort.
*
* @private
* @param {array} array Input array
* @returns {array} array Sorted input array
*/
function insertionSort(array) {
var current;
var j;
for (var i = 1; i < array.length; i += 1) {
current = array[i];
j = i - 1;
while (j >= 0 && current < array[j]) {
array[j + 1] = array[j];
j -= 1;
}
array[j + 1] = current;
}
return array;
}
/**
* Creates buckets for given array
*
* @private
* @param {array} array Input array
* @returns {array} buckets Array whith array for each bucket.
* Each bucket contains an array with all elements
* from the input which are with suitable size.
*/
function createBuckets(array) {
var buckets = [];
var currentBucket;
var current;
for (var i = 0; i < array.length; i += 1) {
current = array[i];
currentBucket = Math.floor(current);
buckets[currentBucket] = buckets[currentBucket] || [];
buckets[currentBucket].push(current);
}
return buckets;
}
/**
* Sorts the arrays from each bucket.
*
* @private
* @param {array} buckets Given buckets
* @returns {array} buckets Buckets with sorted arrays for each bucket
*/
function sortBuckets(buckets) {
for (var i = 0; i < buckets.length; i += 1) {
if (buckets[i] !== undefined) {
insertionSort(buckets[i]);
}
}
return buckets;
}
/**
* Unions all buckets' arrays
*
* @private
* @param {array} buckets Input buckets
* @returns {array} result Sorted array which contains
* all elements form each bucket
*/
function unionBuckets(buckets) {
var result = [];
var currentBucket;
for (var i = 0; i < buckets.length; i += 1) {
currentBucket = buckets[i];
if (currentBucket !== undefined) {
result = result.concat(currentBucket);
}
}
return result;
}
/**
* Sorts given array with bucketsort.
* Time complexity: O(N) in case the
* data is with uniform distribution.
*
* @example
*
* var sort = require('path-to-algorithms/src/'+
* 'sorting/bucketsort').bucketSort;
* console.log(sort([2, 5, 1, 0, 4])); // [ 0, 1, 2, 4, 5 ]
*
* @public
* @module sorting/bucketsort
* @param {Array} array Input array which should be sorted.
* @return {Array} Sorted array.
*/
return function (array) {
var buckets = createBuckets(array);
sortBuckets(buckets);
return unionBuckets(buckets);
};
}());
exports.bucketSort = bucketSort;
})(typeof window === 'undefined' ? module.exports : window);