초코레

병합 정렬(merge sort) 본문

알고리즘

병합 정렬(merge sort)

초코레 2019. 12. 29. 14:02
  • 배열을 앞부분과 뒷부분으로 나누어 각각 정렬한 다음 병합하는 작업을 반복하여 정렬을 수행하는 알고리즘
  • 정렬을 마친 배열의 병합을 응용하여 분할 정복법에 따라 정렬하는 알고리즘
  • 먼저 배열을 앞부분과 뒷부분으로 나눈다.
  • 이때 앞뒤의 각 배열을 정렬할 때는 다시 병합 정렬을 적용한다.
  • 나눈 두 배열을 각각 정렬하고 병합하면 배열 모두를 정렬할 수 있다.
  • 배열의 요소 개수가 2개 이상인 경우에 배열의 앞부분과 뒷부분을 각각 병합 정렬로 정렬하고 병합한다.
  • java.util.Arrays 패키지에서 배열을 정렬하는 클래스 메서드인 sort를 제공한다.
    • 기본 자료형의 배열을 정렬하는 sort 메서드는 퀵 정렬 알고리즘을 개선한 것으로 안정적이진 않다.
    • 클래스 객체 배열을 정렬하는 sort 메서드는 병합 정렬을 개선한 것으로 안정적인 결과가 보장된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//병합 정렬
 
static int[] buff;    // 병합한 결과를 일시적으로 저장할 작업용 배열
 
// a[left] ~ a[right]를 재귀적으로 병합 정렬 
static void __mergeSort(int[] a, int left, int right) {
    if (left < right) {
        int i;
        int center = (left + right) / 2;
        int p = 0;
        int j = 0;
        int k = left;
 
        __mergeSort(a, left, center);            // 배열의 앞부분을 병합 정렬합니다.
        __mergeSort(a, center + 1, right);       // 배열의 뒷부분을 병합 정렬합니다.
 
        //병합 수행
        for (i = left; i <= center; i++)        //a 배열의 앞부분을 작업용 배열에 복사
            buff[p++= a[i];
 
        while (i <= right && j < p)             //a 배열의 뒷부분과 작업용 배열에 복사한 a 배열의 앞부분을 병합한 과를 배열 a에 저장
            a[k++= (buff[j] <= a[i]) ? buff[j++] : a[i++];
 
        while (j < p)                           //작업용 배열에 남은 요소를 배열 a에 복사
            a[k++= buff[j++];
    }
}
 
// 병합 정렬
static void mergeSort(int[] a, int n) {
    buff = new int[n];                // 작업용 배열을 생성합니다.
 
    __mergeSort(a, 0, n - 1);        // 배열 전체를 병합 정렬합니다.
 
    buff = null;                    // 작업용 배열을 해제합니다.
}
 
cs

'알고리즘' 카테고리의 다른 글

도수 정렬  (0) 2019.12.30
힙 정렬(heap sort)  (0) 2019.12.29
퀵 정렬(quick sort)  (0) 2019.12.28
셸 정렬(shell sort)  (0) 2019.12.28
단순 삽입 정렬(straight insertion sort) / 셔틀 정렬(shuttle sort)  (0) 2019.12.28