Free Lines Arrow
본문 바로가기
Algorithm/알고리즘 기본

[Algorithm] 병합정렬(merger sort)

by skahn1215 2021. 4. 13.
728x90
반응형

병합정렬?

병합 정렬의 특징은 빠르다.

구현이 어렵다.

 

병합 정렬의 flow

1. 분할: 문제를 반으로 나눈다.

2. 정복: 반으로 나눈 문제를 해결한다.

3. 병합: 해결된 문제들을 합친다.

 

예시

12345678 이 있으면 다음 단계로 나눈다.

1단: 1234 | 5678

2단: 12 | 34 | 56 | 78

3단: 1|2|3|4|5|6|7|8

 

다시 문제들을 정복해 나가면서 병합한다.

 

구현

public class MergeSort {

    MergeSort(){};

    public void merge(int []data, int start, int center, int end)
    {
        int i = start; // 배열 앞부분 인덱스
        int j = center+1; // 배열 중간 인덱스
        int k = start; // 시작점.

        int[] tmp = new int [data.length];

        // 앞과 뒷쪽 부분중 제일 적은 값을 앞에 채운다.
        while (i <= center && j <= end) {
            if (data[i] <= data[j]) {
                tmp[k++] = data[i++];
            } else {
                tmp[k++] = data[j++];
            }
        }

        // while 문을 둘중에 하나만 실행됨.
        while (i <= center) {
            tmp[k++] = data[i++];
        }

        while (j <= end) {
            tmp[k++] = data[j++];
        }

        // 정렬된 배열을 전체 넣어줌.
        for (int index=start; index<=end; index++){
            data[index] = tmp[index];
        }

    }

    public void mergerSort(int[] data, int start, int end)
    {
        // 중간지점 구함
        if (start < end) {
            int center = (start + end) / 2;
            mergerSort(data, start, center);
            mergerSort(data, center + 1, end);
            merge(data, start, center, end);
        }
    }

    public static void main(String[] args){
        int []data = {1,33,4,22,56,2};
        MergeSort msort = new MergeSort();
        msort.mergerSort(data,0, data.length-1);
        for (int i =0; i<data.length; i++){
            System.out.println(data[i]);
        }
    }
};
728x90
반응형

'Algorithm > 알고리즘 기본' 카테고리의 다른 글

[Algorithm] Binary Search Tree - Insert  (0) 2021.06.08
[Algorithm] Counting Sort  (0) 2021.05.21
[Algorithm] Max heapify 구현과 이론  (0) 2021.05.04
[Algorithm] 조합 구현  (0) 2021.04.11
[Algorithm] 순열과 조합  (0) 2021.04.11

댓글