[알고리즘] 합병정렬

2022. 11. 22. 00:15·개발/알고리즘
728x90
반응형

1. 합병정렬

기존 버블, 선택, 삽입정렬은 O(N^2)의 시간복잡도를 가진다.

합병정렬을 통해 o(NlogN)으로 향상시킬 수 있다.

합병 정렬은 분해와 합병 2가지 순서로 나눌수 있다.

 

예시 )

[8,3,5,4,7,6,1,2]
반으로 분할하여 시작
[8,3,5,4]  [7,6,1,2]
다시 나눔
[8,3] [5,4] [7,6] [1,2]
다시 나눔
[8] [3] [5] [4] [7] [6] [1] [2] 
정렬하면서 합친다.
[3,8] [4,5] [6,7] [1,2]
[3,4,5,8] [1,2,6,7]
[1,2,3,4,5,6,7,8]

2. 합병정렬 순서

(1) 빈배열 만들기, 입력 두개를 취하는 함수를 정의하여 마지막에 반환할 빈 뱅열 만들기

(2) i와 j가 각각 배열끝에 도달하지 않았다면 첫번째 배열의 값으로 첫번째 항목을 취한 다음 두번째 배열의 첫번째 항목값과 비교한다.

(3) 첫번째 항목이 더 작다면 결과배열에 집어넣은 다음 첫번째 배열의 다음 항목으로 넘어간다.

     반대의 경우에는 두번째 배열의 값을 취한 다음 두번째 배열의 다음값으로 넘어간다.

(4) 배열 하나를 완료한 다음에는 다른 배열의 남은 값을 모두 넣는다.

 

예시)

 [1,10,50] [2,14,99,100]
 1,2 비교후 1을 배열에 집어넣는다.
 [1]  
 다음 10 과 2를 비교후 작은값을 넣는다.
 [1,2]
 다음 10,14비교
 [1,2,10]
 반복
 [1,2,10,14,50]
 첫번째 배열이 끝났을때는 나머지 배열을 전부 넣어준다.
 [1,2,10,14,50,99,100]

3. 합병 구현

정렬하며 합치는 함수부터 구현한다.

function merge(arr1, arr2) {
  let i = 0;
  let j = 0;
  let temp = [];
  while (i < arr1.length || j < arr2.length) {
    if (i == arr1.length) {
      temp.push(arr2[j]);
      j++;
    } else if (j == arr2.length) {
      temp.push(arr2[i]);
      i++;
    } else {
      if (arr1[i] < arr2[j]) {
        temp.push(arr1[i]);
        i++;
      } else {
        temp.push(arr2[j]);
        j++;
      }
    }
  }
  return temp;
}

4. 합병 정렬 구현

function mergeSort(arr) {
  if (arr.length <= 1) return arr;
  let index = Math.floor(arr.length / 2);
  let left = mergeSort(arr.slice(0, index));
  let right = mergeSort(arr.slice(index));
  return merge(left, right);
}

5. 합병정렬 빅O

시간복잡도(최고) 시간복잡도(평균) 시간복잡도(최악) 공간복잡도
O(nlogn) O(nlogn) O(nlogn) O(n)

 

728x90
반응형

'개발 > 알고리즘' 카테고리의 다른 글

[알고리즘] 기수정렬  (0) 2022.11.22
[알고리즘] 퀵정렬  (0) 2022.11.22
[알고리즘] 버블정렬, 선택정렬, 삽입정렬  (0) 2022.11.17
[알고리즘] 선형검색, 이진검색  (0) 2022.11.15
[알고리즘] 재귀함수 문제 모음  (31) 2022.11.15
'개발/알고리즘' 카테고리의 다른 글
  • [알고리즘] 기수정렬
  • [알고리즘] 퀵정렬
  • [알고리즘] 버블정렬, 선택정렬, 삽입정렬
  • [알고리즘] 선형검색, 이진검색
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    js
    React
    node.js
    컨테이너
    블록체인
    erc20
    go
    명령어
    ERC721
    html
    CSS
    node
    mysql
    프로그래머스
    하이퍼레저
    nodejs
    go언어
    30일챌린지
    30일 챌린지
    도커
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[알고리즘] 합병정렬
상단으로

티스토리툴바