문제설명
정수를 요소로 갖는 배열을 입력받아 오름차순으로 정렬하여 리턴해야 합니다. 단 병합정렬을 사용해야 하며 조건은 다음과 같습니다.
입력
인자 1 : arr
출력
입출력 예시
let output = mergeSort([3, 1, 21]);
console.log(output); // --> [1, 3, 21]
병합정렬이란?
풀이코드
const merge = function (left, right) {
//merged 배열 선언
let merged = [];
//left, right 인덱스 변수 선언
let leftIdx = 0,
rightIdx = 0;
//size는 left와 right의 길이를 합친 총 길이
const size = left.length + right.length;
//size크기만큼 반복 순회
for (let i = 0; i < size; i++) {
//left 인덱스가 left 길이보다 크거나 같을 때
if (leftIdx >= left.length) {
merged.push(right[rightIdx]);
rightIdx++;
//right 인덱스가 right 길이 이상이거나 left배열의 left 인덱스가 right배열의 right인덱스 이하일 때
} else if (rightIdx >= right.length || left[leftIdx] <= right[rightIdx]) {
merged.push(left[leftIdx]);
leftIdx++;
} else {
//위 케이스 외에는 merged 배열에 right배열의 right 인덱스를 삽입
merged.push(right[rightIdx]);
rightIdx++;
}
}
return merged;
};
const mergeSort = function (arr) {
//2미만일 때 arr 리턴
if (arr.length < 2) return arr;
//middle에 arr 배열을 2등분한 것을 저장
const middle = parseInt(arr.length / 2);
//left, right에 각각 middle을 기점으로 slice한 값을 저장함
const left = mergeSort(arr.slice(0, middle));
const right = mergeSort(arr.slice(middle));
//merge 함수 호출값을 merged에 저장
const merged = merge(left, right);
return merged;
};