합병 정렬 (Merge Sort)

2020. 7. 25. 19:22· algorithm

- Simple, slow

  • Bubble sort
  • Insertion sort
  • Selection sort

- Fast

  • Quick sort
  • Merge sort
  • Heap sort

- O(N)

  • Radix sort

 

 

정렬 중 이번엔 Merge sort에 대해 다뤄본다.

 

3단계를 거쳐 정렬이 이루어진다.

1) 분할: 해결하고자 하는 문제를 작은 크기의 동일한 문제들로 분할한다.

    ex) 최대값을 구할 때, 리스트를 반으로 나누어 각각의 최대값을 구하여, 전체리스트의 최대값을 구하는 것과 비슷하다.

2) 정복: 각각의 작은 문제를 순환적으로 해결한다.

3) 합병: 작은 문제의 해를 합하여 (merge) 원래 문제에 대한 해를 구한다.

늘은 Simple하고 slow한 특성을 갖는 selection sort와 bubbl

 

mergeSort(A[], p, r) {//A[p...r]을 정렬한다
	if (p < r){ //p>=r인경우 -> 리스트의 개수가 0 또는 1, 즉 아무것도 안해도 됨 
		q < -(p + q) / 2; //p,q의 중간 지점 계산
		mergeSort(A, p, q);// 전반부 정렬
		mergeSort(A, q + 1, r);//후반부 정렬
		merge(A, p, q, r);//합병
	}
}
merge(A[], p, q, r) {
	정렬되어 있는 두 배열 A[p,...,q]와 A[q+1,...,r]을 합하여
	정렬된 하나의 배열 A[p,...,r]을 만든다.
}

 


그렇다면, 정렬된 리스트를 어떠한 방식으로 합병(merge)해야할까?

1) 모두 1개로 쪼개진 리스트로 만들어진 상태라고 가정하자.(initial sequence)

2) i: 1번째 리스트 중 첫번째 값

     j: 2번째 리스트 중 첫번째 값

     k: 전체 리스트 중 첫번째 값

- 위와 같이 i와 j를 이용해 비교하며 새로운 배열의 값 k를 채워나가면 합병 정렬이 완료 된다.

void merge(int data[], int p, int q, int r) {
	int i = p, j = q + 1, k = p;
	int tmp[data.length()];
	while (i <= q && j <= r) {
		if (data[i] <= data[j])
			tmp[k++] = data[i++];
		else
			tmp[k++] = data[j++];
	}
	//쪼개진 리스트 중 하나가 끝에 다다른 경우
	while (i <= q)
		tmp[k++] = data[i++];
	while (j <= r)
		tmp[k++] = data[j++];
	for (int i = p; i <= r; i++)//tmp리스트를 다시 data리스트로 옮김.
		data[i] = tmp[i];
}

merge sort의 시간복잡도

-> T(n)= 2* T(n/2) + n = O(nlogn)

 

 

반응형
저작자표시

'algorithm' 카테고리의 다른 글

[ 프로그래머스 | 2022 kako tech internship ] 두 큐 합 같게 만들기 시간초과 해결  (0) 2023.11.10
C/C++ 헷갈리는 포인터/배열/동적할당 정리  (0) 2021.04.03
정렬 알고리즘 종류  (0) 2020.07.24
멱집합(Powerset)  (0) 2020.07.23
[recursion 응용] n queens problem  (0) 2020.07.22
'algorithm' 카테고리의 다른 글
  • [ 프로그래머스 | 2022 kako tech internship ] 두 큐 합 같게 만들기 시간초과 해결
  • C/C++ 헷갈리는 포인터/배열/동적할당 정리
  • 정렬 알고리즘 종류
  • 멱집합(Powerset)
이티권
이티권
programming, design
이티권
ET WORLD
이티권
전체
오늘
어제
  • 분류 전체보기 (85)
    • Web (43)
      • Three.js (1)
      • javascript (6)
      • React (2)
    • algorithm (18)
      • BOJ (6)
    • Record (9)
      • 생각 (6)
      • 경험 (3)
    • Art (7)
    • Technology (8)
      • Data (2)
      • Info (5)

블로그 메뉴

  • WEB
  • RECORD
  • ALGORITHM
  • TECH
  • ART

공지사항

인기 글

태그

  • 깃 CLI
  • 컴퓨터공학힘든가요
  • 불확신
  • 깃허브시작
  • 깃허브하는법
  • HTML
  • 뷰라우터
  • vue.js
  • 퓨 이벤트
  • js
  • 순환
  • svgr
  • 알고리즘문제
  • 맥북소리녹화
  • 레포지터리만들기
  • 포토샵
  • CSS
  • 스프레드문법
  • 뷰 프롭스
  • 페이지 링크
  • C언어
  • 재귀함수
  • html tag
  • ChatGPT
  • 알고리즘
  • 시니어프론트엔드개발자
  • 뷰링크
  • 나머지매개변수
  • 컴포넌트 통신
  • 기명함수 표현식

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
이티권
합병 정렬 (Merge Sort)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.