병합 정렬


병합 정렬(merge sort)

수열을 정렬하는 알고리즘 중 하나. 분할 정복 일고리즘의 하나.
시간 복잡도: O(nlogn)

처음에는 수열을 반씩 분할한다.(분할, Divide)
[ 6, 4, 3, 7, 5, 1, 2 ]
divide_array 분할을 완료한 뒤 다시 분할한 각 그룹을 병합해간다.(결합, Combine)
병합할 때에는 병합 후의 그룹 내에서 숫자가 작은 순으로 나열되도록 한다.(정복, Conquer)
여러 숫자를 포함하고 있는 그룹들을 서로 병합할 때는 선두의 숫자를 비교해서 작은 숫자를 이동한다.
그룹 병합 작업은 모든 숫자가 하나의 그룹이 될 때까지 재귀적으로 반복한다.
conquer_and_combine

장단점

  • 장점
    • 안정적인 데이터 정렬 방법
    • 데이터의 분포에 영향을 덜 받는다. 입력 데이터가 무엇이든 간에 정렬되는 시간은 동일하다.
  • 단점
    • 제자리 정렬(in-place sorting)이 아니다.
    • 레코드들의 크기가 큰 경우에는 이동 횟수가 많으므로 매우 큰 시간적인 낭비를 초래할 수 있다.

병합 정렬(merge sort) js 코드

const merge = (left, right) => {
  // 정렬된 항목들을 담을 배열
  let sortedArr = [];

  while (left.length && right.length) {
    // 가장 작은 값을 sortedArr에 push
    if (left[0] < right[0]) {
      sortedArr.push(left.shift());
    } else {
      sortedArr.push(right.shift());
    }
  }
  return [...sortedArr, ...left, ...right];
};

const mergeSort = (arr) => {
  // return 조건문
  if (arr.length <= 1) return arr;

  let mid = Math.floor(arr.length / 2);

  // 재귀적으로 left와 right를 호출
  let left = mergeSort(arr.slice(0, mid));
  let right = mergeSort(arr.slice(mid));

  return merge(left, right);
};

ref