본문 바로가기
JS sort_algolithm/Stable Sort

merge Sort ( 합병정렬 )

by Box 2021. 12. 15.
728x90

합병정렬이란?

위의 그림과 같은 방식으로 작동해 배열을 정렬시켜주는 알고리즘입니다.
합병 정렬은 비교 기반 정렬 알고리즘으로 시간복잡도는 O(NlogN)입니다.

시간복잡도

  • 최악 시간복잡도: O(nlogn)
  • 평균 시간복잡도: O(nlogn)
  • 최선 시간복잡도: O(nlogn)

 

합병정렬 javascript로 구현하기

병합정렬은 크게 두 가지 함수로 이루어져 있다.

  1. function merge(left, right) : 이미 소팅된 배열 left, right 받아서 하나로 합치는 순수한 함수
  2. function mergeSort(arr) : 배열을 반으로 쪼개서 merge 함수에게 left, right 인자를 넘겨주는 함수

이 때, merge함수는 순수한 함수이고, mergeSort는 재귀로 함수를 콜한다는 것을 인지해야 한다.

 

merge function

merge 함수는 이미 정렬 된 left(배열), right(배열)를 인자로 받아서 하나로 합치는 기능

results array 선언
while left, right 모두 element 남아 있을 때까지
    left[0] <= right[0] left의 맨 앞에 것 빼서 results 에 푸쉬
    left[0] > right[0] right의 맨 앞에 것 빼서 results 에 푸쉬

return [...results, ...left, ...right] 남은 것 다 배열에 넣어주기

mergeSort function

mergeSort 는 반으로 쪼개서 merge 에게 인자를 넘겨주는 기능

이 함수의 recursive call 종료 조건은 legnth 가 1일 때, 더 이상 쪼갤 수 없게 된다. => 정렬된 배열인 셈이다.
length >=2 이면 계속해서 반으로 쪼갠다

return merge( mergeSort(left), mergeSort(right) );
// legnth 1이 될 때 까지 쪼개다가 length === 1인 배열을 만나면
// 그제서야 merge함수가 실행된다. legnth 가 1일때 가장 아랫단계에서 sorted 된 것이므로.. 쭉쭉 스택콜을 타고 올라온다.

이용되는 2가지 함수를 봤으니 코드를 보고 이해해봅시다!

unction merge(left, right) {
  const sortedArr = [];
  while (left.length && right.length) {
    //left[0]이 더작을 경우 같을때는 누가 먼저 들어가도 상관X
    if (left[0] <= right[0]) {
      sortedArr.push(left.shift());
    } else {
      sortedArr.push(right.shift());
    }
  }
  //left,right 둘 중 하나는 요소가 남아있기 때문에 sortedArr 뒤에 붙여서 출력
  //비어있으면 spread Syntax에도 아무것도 없기 때문에 그냥 다 붙여준다.
  return [...sortedArr, ...left, ...right];
}

function mergeSort(arr) {
  if (arr.length === 1) return arr;
  const boundary = Math.ceil(arr.length / 2);
  //slice로 해주기 때문에 원본 arr은 손상 없다.
  const left = arr.slice(0, boundary);
  const right = arr.slice(boundary);
    //요소가 1개 일 때까지 재귀를 실행해 요소가 1개일 때 두 left,right부터
  	//차근차근 merge(정렬해서 합치기)해주면 된다.
  return merge(mergeSort(left), mergeSort(right));
}

const arr = [7, 4, 3, 2, 1, 6, 5];
const sortedArray = mergeSort(arr);
console.log(arr); //[7, 4, 3, 2, 1, 6, 5]
console.log(sortedArray); //[1, 2, 3, 4,5, 6, 7]

'JS sort_algolithm > Stable Sort' 카테고리의 다른 글

Insertion Sort(삽입 정렬)  (0) 2021.12.09
Bubble Sort(버블 정렬)  (0) 2021.12.09