(function (exports) {
'use strict';
var quicksort = (function () {
function charAt(str, i) {
return (i < str.length) ? str.charCodeAt(i) : -1;
}
function swap(arr, i, j) {
var temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
function quicksort(arr, lo, hi, d) {
if (lo >= hi) {
return;
}
var lowPointer = lo;
var highPointer = hi;
var p = charAt(arr[lo], d);
var i = lo + 1;
var current;
while (i <= highPointer) {
current = charAt(arr[i], d);
if (current < p) {
swap(arr, i, lowPointer);
lowPointer += 1;
} else if (current > p) {
swap(arr, i, highPointer);
highPointer -= 1;
i += 1;
} else {
i += 1;
}
}
quicksort(arr, lo, lowPointer - 1, d);
if (p >= 0) {
quicksort(arr, lowPointer, highPointer, d + 1);
}
quicksort(arr, highPointer + 1, hi, d);
}
/**
* Effective inplace string sorting algorithm.
* Algorithm is NOT stable.
*
* @example
*
* var sort = require('path-to-algorithms/src/sorting'+
* '/3-way-string-quicksort').quicksort;
* console.log(sort(['bb', 'aa', 'cc'])); // [ 'aa', 'bb', 'cc' ]
*
* @public
* @module sorting/3-way-string-quicksort
* @param arr {Array} array which should be sorted.
* @return {Array} Sorted array.
*/
return function sort(arr) {
quicksort(arr, 0, arr.length - 1, 0);
return arr;
};
}());
exports.quicksort = quicksort;
})(typeof window === 'undefined' ? module.exports : window);