(function (exports) {
'use strict';
function compare(a, b) {
return a - b;
}
/**
* Quicksort algorithm
*
* @public
* @param {array} array Array which should be sorted.
* @return {array} Sorted array.
*/
var quickSort = (function () {
/**
* Partitions the array in two parts by the middle elements.
* All elemnts which are less than the chosen one goes left from it
* all which are greater goes right from it.
* Uses Hoare's partitioning algorithm.
*
* @param {array} array Array which should be partitioned
* @param {number} left Left part of the array
* @param {number} right Right part of the array
* @return {number}
*/
function partition(array, left, right, cmp) {
var pivot = array[Math.floor((left + right) / 2)];
var temp;
while (left <= right) {
while (cmp(array[left], pivot) < 0) {
left += 1;
}
while (cmp(array[right], pivot) > 0) {
right -= 1;
}
if (left <= right) {
temp = array[left];
array[left] = array[right];
array[right] = temp;
left += 1;
right -= 1;
}
}
return left;
}
/**
* Recursively calls itself with different values for
* left/right part of the array which should be processed
*
* @private
* @param {array} array Array which should be processed
* @param {number} left Left part of the array which should be processed
* @param {number} right Right part of the array which should be processed
*/
function quicksort(array, left, right, cmp) {
var mid = partition(array, left, right, cmp);
if (left < mid - 1) {
quicksort(array, left, mid - 1, cmp);
}
if (right > mid) {
quicksort(array, mid, right, cmp);
}
}
/**
* Quicksort algorithm. In this version of quicksort used
* middle element of array for the pivot.
* Time complexity: O(N log(N)).
*
* @example
*
* var sort = require('path-to-algorithms/src' +
* '/sorting/quicksort-middle').quickSort;
* console.log(sort([2, 5, 1, 0, 4])); // [ 0, 1, 2, 4, 5 ]
*
* @public
* @module sorting/quicksort-middle
* @param {Array} array Input array.
* @param {Function} cmp Optional. A function that defines an
* alternative sort order. The function should return a negative,
* zero, or positive value, depending on the arguments.
* @return {Array} Sorted array.
*/
return function (array, cmp) {
cmp = cmp || compare;
quicksort(array, 0, array.length - 1, cmp);
return array;
};
}());
exports.quickSort = quickSort;
})(typeof window === 'undefined' ? module.exports : window);