(function (exports) {
'use strict';
function comparator(a, b) {
return a - b;
}
var heapSort = (function () {
/**
* Finds the correct place of given element in given max heap.
*
* @private
* @param {Array} array Array.
* @param {Number} index Index of the element which palce in
* the max heap should be found.
* @param {Number} heapSize Size of the heap.
* @param {function} cmp Comparison function.
*/
function heapify(array, index, heapSize, cmp) {
var left = 2 * index + 1;
var right = 2 * index + 2;
var largest = index;
if (left < heapSize && cmp(array[left], array[index]) > 0) {
largest = left;
}
if (right < heapSize && cmp(array[right], array[largest]) > 0) {
largest = right;
}
if (largest !== index) {
var temp = array[index];
array[index] = array[largest];
array[largest] = temp;
heapify(array, largest, heapSize, cmp);
}
}
/**
* Builds max heap from given array.
*
* @private
* @param {Array} array Array which should be turned into max heap.
* @param {function} cmp Comparison function.
* @return {Array} array Array turned into max heap.
*/
function buildMaxHeap(array, cmp) {
for (var i = Math.floor(array.length / 2); i >= 0; i -= 1) {
heapify(array, i, array.length, cmp);
}
return array;
}
/**
* Heapsort. Turns the input array into max
* heap and after that sorts it.<br><br>
* Time complexity: O(N log N).
*
* @example
*
* var sort = require('path-to-algorithms/src' +
* '/sorting/heapsort').heapSort;
* console.log(sort([2, 5, 1, 0, 4])); // [ 0, 1, 2, 4, 5 ]
*
* @public
* @module sorting/heapsort
* @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 || comparator;
var size = array.length;
var temp;
buildMaxHeap(array, cmp);
for (var i = array.length - 1; i > 0; i -= 1) {
temp = array[0];
array[0] = array[i];
array[i] = temp;
size -= 1;
heapify(array, 0, size, cmp);
}
return array;
};
}());
exports.heapSort = heapSort;
})(typeof window === 'undefined' ? module.exports : window);