You are on page 1of 6

병합

정렬
• 병합 정렬(merge sort)은 배열을 앞부분과 뒷부분의 두 그룹으로 나누어 각각 정렬한 후 병합하는 작업을 반복하는
알고리 즘이다. 안정정렬
정렬을 마친 배열의 병합
• 먼저 정렬을 마친 두 배열의 병합과정을 살펴보자. 각 배열에서 주목하는 원소의 값을 비교하여 작은 쪽의 원소를 꺼내
새로운
배열에 저장한다. 이 작업을 반복하며 정렬을 마친 배열을 만든다.

• 정렬을 마친 배열의 병합을 수행하는 프로그램이다. merge() 함수는


원소수 가 na인 배열 a와 nb인 배열 b를 병합하여 배열 c에 저장한다.

• 배열 a, b, c를 스캔할 때 주목하는 원소의 인덱스는 각각 pa, pb, pc이다.


이 인덱스를 저장한 변수를 커서라고 하자. 처음에는 맨 앞 원소에
주목하므로 모 두 0으로 초기화한다.

• 왼쪽의 프로그램은 3개의 반복문을 늘어놓은 단순한 병합 알고리즘이다.


병합 하는 데 필요한 시간 복잡도는 O(n)이다.
병합
정렬
정렬을 마친 배열의
병합
병합 • 11~12행 : 배열 a의 a[pa]와 배열 b의 b[pb]를
주목하 여 이 가운데 작은 값을 c[pc]에 저장한다.
이어서 a, b, c 배열의 커서를 1씩 증가시킨다. a[0]와
정렬
정렬을 마친 배열의 b[0]을 비교하여 작은 값 1을 c[0]에 대입한다. 이후
b와 c 배열의 커서 pb 와 pc만 1칸씩 오른쪽으로
병합
이동한다. 이때 값을 꺼내지 않 은 배열 a의 커서 pa는
이동하지 않는다. 이처럼 a[pa]와 b[pb]를 비교하여
작은 값을 c[pc]에 대입하고, 꺼낸 쪽 배열의 커서와
배열 c의 커서를 이동하는 작업을 반복한다. 커서 pa와
pb가 각각 배열의 맨끝에 도달하면 while문이
종료된다.
• 13~14행 : 이 while문은 앞에서 배열 b의 모든 원소를
배 열 c로 복사했지만, 배열 a에 아직 복사하지 않은
원소가 있 으면 실행된다. 즉, 커서 pa가 배열 a의 맨
끝에 도달하지 않은 경우이다. 커서를 이동시키면서
배열 a에 남은 원소를 배열 c에 복사한다.

• 15~16행 : 이 while문은 배열 a의 모든 원소를 배열 c로


복사했지만, 배열 b에 아직 복사하지 않은 원소가
있으면 실행된다. 즉, 커서 pb가 배열 b의 맨 끝에
도달하지 않은 경우이다. 커서를 이동시키면서 배열
b에 남은 모든 원소를 배열 c에 복사한다.
병합
정렬
병합 정렬 만들기
• 정렬을 마친 배열의 병합을 응용하여 분할 정복법에 따라 정렬하는 알고리즘을 병합 정렬이라고 한다. 아래 그림은
병합 정렬 을 나타낸 것으로 배열을 앞부분과 뒷부분으로 나눈다. 이 그림은 배열의 원소 수가 12개이므로 6개씩
2개의 배열로 나눈다. 나눈 배열을 각각 정렬한 뒤 병합하여 배열 정렬을 완료한다.

• 원소를 6개씩 나눈 앞부분과 뒷부분의 정렬을 각각 수행할 때도 똑같이 병합


정렬 을 적용하여 진행한다. 예를 들어 뒤부분의 정렬은 오른쪽과 같다. 이
과정에서 새 로 나뉜 앞부분(9, 0, 1)과 뒷부분(5, 2, 3)도 똑같은 방법으로
병합 정렬한다.
병합
정렬
병합 정렬
만들기
• 병합정렬
알고리즘

• 배열 병합의 시간 복잡도는 O(n)이다.


데이터 원소 수가 n일 때 병합 정렬의 단계는
logn만큼 필요하므로 전체 시간 복잡도는
O(nlogn)이다. 병합 정렬 알고리즘은 서로
떨어져 있는 원소를 교환하는 것이 아니므로
안정적이다.
병합
정렬
병합 정렬
프로그램

You might also like