리스트의 길이가 0 또는 1이면 이미 정렬된 것으로 본다. 그렇지 않은 경우에는 정렬되지 않은 리스트를 절반으로 잘라 비슷한 크기의 두 부분 리스트로 나눈다. 각 부분 리스트를 재귀적으로 합병 정렬을 이용해 정렬한다. 두 부분 리스트를 다시 하나의 정렬된 리스트로 합병한다.

function merge(arr1, arr2) {
let combined = [];
let i = 0;
let j = 0;
while (i < arr1.length && j < arr2.length) {
if (arr1[i] < arr2[j]) {
combined.push(arr1[i]);
i++;
} else {
combined.push(arr2[j]);
j++;
}
}
while (i < arr1.length) {
combined.push(arr1[i]);
i++;
}
while (j < arr2.length) {
combined.push(arr2[j]);
j++;
}
return combined;
}
function mergeSort(arr) {
if (arr.length === 1) return arr;
let mid = Math.floor(arr.length / 2);
let left = arr.slice(0, mid);
let right = arr.slice(mid);
return merge(mergeSort(left), mergeSort(right));
}
const mergesortArr = mergeSort([1, 5, 2, 6]);
console.log(mergesortArr);