본문 바로가기
알고리즘

[javascript] merge sort (병합정렬 자바스크립트 알고리즘) 📊

by MOOB 2020. 1. 24.

병합 정렬

하나의 리스트를 두 개의 균등한 크기로 분할하고 분할된 부분 리스트를 정렬한 다음, 두 개의 정렬된 부분 리스트를 합하여 전체 정렬을 하는 방법

 

 

 

 

병합 정렬은 다음 세가지 과정을 통해 이루어진다.

 

  • 분할(Divide): 배열을 같은 크기의 2개의 배열로 분할한다.
  • 정복(Conquer): 분할된 배열을 정렬.
  • 결합(Combine): 정렬된 부분 배열을 다시 합침

 

const mergeSort = function(array) {
  if (array.length < 2) return array; 
  let pivot = Math.floor(array.length / 2); //쪼개기
  let left = array.slice(0, pivot); 
  let right = array.slice(pivot, array.length); 
  return merge(mergeSort(left), mergeSort(right)); // 재귀
}
function merge(left, right) {
  let result = [];
  while (left.length && right.length) { // ___.length가 true일 때 === 배열 안에 값이 남아있을 때
    if (left[0] <= right[0]) { 
      result.push(left.shift()); // shift() 메서드는 배열에서 첫 번째 요소를 제거하고, 제거된 요소를 반환합니다.
    } else {
      result.push(right.shift()); 
    }
  }
  while (left.length) result.push(left.shift()); 
  while (right.length) result.push(right.shift());
  return result;
};

console.log(mergeSort([5,2,4,7,6,1,3,8]));

병합정렬의 특징

 

  • 안정적이다.
  • O(nlog₂n)로 정렬 시간이 일정하다.
  • 배열의 크기가 크면 시간이 오래걸린다.
  • temp 변수가 필요하다.
  • 크기가 클 경우 퀵정렬보다 효율적임

댓글