function mergeSort(array) {
if (array.length <= 1) return array;
mergeSortHelper(array, 0, array.length - 1);
return array;
}
function mergeSortHelper(array, leftIdx, rightIdx) {
if (rightIdx <= leftIdx) return;
const middleIdx = Math.floor(leftIdx + (rightIdx - leftIdx) / 2);
mergeSortHelper(array, leftIdx, middleIdx);
mergeSortHelper(array, middleIdx + 1, rightIdx);
merge(array, leftIdx, middleIdx, middleIdx + 1, rightIdx);
}
function merge(array, left, leftEnd, right, rightEnd) {
const sizeSortedArray = rightEnd - left + 1;
const sortedArray = [];
let leftIdx = left,
rightIdx = right;
let sortedArrayIdx = 0;
while (leftIdx <= leftEnd && rightIdx <= rightEnd) {
if (array[leftIdx] < array[rightIdx]) {
sortedArray[sortedArrayIdx++] = array[leftIdx++];
} else {
sortedArray[sortedArrayIdx++] = array[rightIdx++];
}
}
while (leftIdx <= leftEnd) {
sortedArray[sortedArrayIdx++] = array[leftIdx++];
}
while (rightIdx <= rightEnd) {
sortedArray[sortedArrayIdx++] = array[rightIdx++];
}
arrayCopy(sortedArray, 0, array, left, sizeSortedArray);
}
function arrayCopy(srcArray, srcIndex, destArray, destIndex, length) {
destArray.splice(
destIndex,
length,
...srcArray.slice(srcIndex, srcIndex + length)
);
}