Computer Science - 병합 정렬

Sangho Moon·2020년 8월 2일
0

Computer Science

목록 보기
22/22
post-thumbnail

병합 정렬은 원소가 한 개가 될 때까지 계속해서 반으로 나누다가 다시 합쳐나가며 정렬을 하는 방식이다.

그리고 이 과정은 재귀적으로 구현된다.


마찬가지로 다음 숫자들을 오름차순으로 정렬해보자.

7 4 5 2 6 3 8 1


먼저 숫자들을 반으로 나눈다.

7 4 5 2 | 6 3 8 1


그리고 나눠진 부분 중 첫번째를 한 번 더 반으로 나눠본다.

7 4 | 5 2 | 6 3 8 1


마지막으로 한 번 더 나눠본다.

7 | 4 | 5 2 | 6 3 8 1


이제 숫자가 두 개 밖에 남지 않았으므로 더 이상 나누지 않고, 두 숫자를 다시 병합한다.

단, 이 때 작은 숫자가 먼저 오도록 한다. 4와 7의 순서를 바꿔서 병합하는 것이다.

4 7 | 5 2 | 6 3 8 1


마찬가지로 5 2 부분도 반으로 나눈 후에 작은 숫자가 먼저 오도록 다시 병합할 수 있다.

4 7 | 2 5 | 6 3 8 1


그럼 이제 4 7과 2 5 두 개의 부분들을 병합해보자.

각 부분들의 숫자들을 앞에서부터 순서대로 읽어들여 비교하여 더 작은 숫자를

병합되는 부분에 가져온다.

즉, 4와 2를 먼저 비교해서 2를 가져온다. 그 후에 4와 5를 비교해서 4를 가져온다.

그리고 7과 5를 비교해서 5를 가져오고, 남은 7을 가져온다.

2 4 5 7 | 6 3 8 1


이제 남은 오른쪽 4개의 숫자들도 위와 동일한 과정을 거친다.

2 4 5 7 | 1 3 6 8


마지막으로 각각 정렬된 왼쪽 4개와 오른쪽 4개의 두 부분을 병합한다.

2와 1을 비교하고, 1을 가져온다. 2와 3을 비교하고, 2를 가져온다. 4와 3을 비교하고, 3을 가져온다.

4와 6을 비교하고… 이 과정을 병합이 끝날때까지 진행하면 아래와 같이 정렬이 완료된다.

1 2 3 4 5 6 7 8


전체 과정을 요약해서 도식화해보면 아래와 같다.

7 | 4 | 5 | 2 | 6 | 3 | 8 | 1 → 가장 작은 부분 (숫자 1개)으로 나눠진 결과이다.

4 7 | 2 5 | 3 6 | 1 8 → 숫자 1개씩을 정렬하여 병합한 결과이다.

2 4 5 7 | 1 3 6 8 → 숫자 2개씩을 정렬하여 병합한 결과이다.

1 2 3 4 5 6 7 8 → 마지막으로 숫자 4개씩을 정렬하여 병합한 결과이다.


이러한 방법을 ‘병합 정렬’ 이라고 한다.


병합 정렬 실행 시간의 상한은 O(n log n) 이다.

숫자들을 반으로 나누는 데는 O(log n)의 시간이 들고, 각 반으로 나눈 부분들을

다시 정렬해서 병합하는 데 각각 O(n)의 시간이 걸리기 때문이다.

실행 시간의 하한도 역시 Ω(n log n) 이다.

숫자들이 이미 정렬되었는지 여부에 관계없이 나누고 병합하는 과정이 필요하기 때문이다.


Ref.
Edwith_boost course

profile
Front-end developer

0개의 댓글