- 문제
- 시도
- arr를 최소 단위로 나누고, 전부 나눈 상태에서 순차적으로 재조립
- 재조립할 때에 정렬을 시켜서 조립하면 마지막에는 정렬된 배열이 나오겠지
- 중간점을 찾아서 나누고, 또 나누고, 또 나누고?
- 반복보다는 재귀가 이해는 쉬운 것 같다
- 베이스 케이스를 길이가 1이 될 때까지로 하고
- 중간점을 찾아, 기준으로 좌, 우로 나누고
- 좌, 우를 또 재귀로 나눠주면서 병합을 해줘야 하니까
- 정렬시키는 내부 함수를 만들어줘서 정렬함수에 나눈 애들을 재귀로 넣어서 리턴하면 되려나..
- 수도코드
const mergeSort = function (arr) {
const sorter = (left, right) => {
let result = [];
while (left.length > 0 && right.length > 0) {
if (left[0] <= right[0]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
return [...result, ...left, ...right]
}
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 sorter(mergeSort(left), mergeSort(right));
};
- 레퍼런스
const mergeSort = function (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 sorter(mergeSort(left), mergeSort(right));
};
const sorter = (left, right) => {
let result = [];
while (left.length > 0 && right.length > 0) {
if (left[0] <= right[0]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
return [...result, ...left, ...right]
}