합병 정렬 (Merge Sort)

  • 분할정복 방법

  • 복잡도 O(nlogn)

function mergeSort(arr) {
  // 배열이 하나일 때는 그대로 리턴
  if (arr.length < 2) return arr;

  const middle = Math.floor(arr.length / 2); // 가운데 인덱스
  const left = arr.slice(0, middle); // 좌측 배열
  const right = arr.slice(middle, arr.length); // 우측 배열

  return merge(mergeSort(left), mergeSort(right));
}


function merge(left, right) {
  const result = [];

  while (left.length && right.length) {
  if (left[0] <= right[0]) {
    result.push(left.shift()); // 더 작은 수를 삽입
  } else {
    result.push(right.shift());
  }
}

  while (left.length) {
    result.push(left.shift());
  }

  while (right.length) {
    result.push(right.shift());
  }

  return result;
}

mergeSort([20, 15, 35, 50, 40, 10, 30, 25])
// [ 10, 15, 20, 25, 30, 35, 40, 50 ]

Last updated