diff --git a/src/merge-sort.js b/src/merge-sort.js index 3ed2758..88d6cb5 100644 --- a/src/merge-sort.js +++ b/src/merge-sort.js @@ -2,31 +2,39 @@ * Sorts an array of integers using the MergeSort algorithm. * @param {Array.} items Array of items to be sorted. */ -aij.mergeSort = function(items) { - var merge = function(left, right) { - var result = []; +aij.mergeSort = (function () { + "use strict"; - while (left.length || right.length) { - result.push( - left.length && left[0] <= (right[0] || Number.MAX_VALUE) ? - left.shift() : - right.shift()); - } - - return result; + function simpleMerge(a, from, pivot, to, buffer) { + var i = -1; + while (++i < to - pivot) { + buffer[i] = a[i + pivot]; } + --i; + --pivot; + while (i >= 0) { + --to; + if (pivot >= from && buffer[i] < a[pivot]) { + a[to] = a[pivot]; + --pivot; + } else { + a[to] = buffer[i]; + --i; + } + } + } - var sort = function(arr) { - var middle = arr && (arr.length / 2) << 0; - - if (!middle) { - return arr; - } else if (arr.length === 2) { - return arr[1] < arr[0] ? arr.reverse() : arr; - } - - return merge(sort(arr.slice(0, middle)), sort(arr.slice(middle))); + function mergeSort(a, from, to, buffer) { + if (to - from > 1) { + var middle = from + Math.floor((to - from) / 2); + mergeSort(a, from, middle, buffer); + mergeSort(a, middle, to, buffer); + simpleMerge(a, from, middle, to, buffer); } + return a; + } - return sort(items); -}; + return function (items) { + return mergeSort(items, 0, items.length, items.slice(0)); + }; +}());