본문 바로가기
코딩테스트/분할 정복

Merge sort

by Luigi.yoon 2023. 8. 1.

 

 

출처 : https://en.wikipedia.org/wiki/Merge_sort 

 

 

 

 

 

public static void main(String[] args) {
    int[] src = new int[]{1, 9, 8, 5, 4, 2, 3, 7, 6};
    int[] tmp = new int[src.length];

    printArray(src);
    mergeSort(src, tmp, 0, src.length-1);
    printArray(src);
}

private static void mergeSort(int[] src, int[] tmp, int start, int end) {
    if(start < end) {
        int mid = (start + end) / 2;
        mergeSort(src, tmp, start, mid);
        mergeSort(src, tmp, mid+1, end);
        merge(src, tmp, start, mid, end);
    }
}

private static void merge(int[] src, int[] tmp, int start, int mid, int end) {
    // 분할1 인덱스 p : start 부터 mid 까지
    // 분할2 인덱스 q : mid+1 부터 end 까지
    // 임시보관용 인덱스 tmpIdx : start 부터 end 까지
    int p = start, tmpIdx = start;
    int q = mid + 1;

    while(p <= mid || q <= end) { // p, q 둘중 하나라도 끝나지 않은 경우 반복 

        // q 만 끝난 경우 또는 p,q 모두 안끝나고 src[p] 가 src[q] 보다 먼저인 경우
        if(q > end || (p <= mid && src[p] <= src[q])) {
            // 값을 임시보관소로 복사하며 인덱스는 1씩 증가시킨다. 
            tmp[tmpIdx++] = src[p++];
        } else {
            // 값을 임시보관소로 복사하며 인덱스는 1씩 증가시킨다. 
            tmp[tmpIdx++] = src[q++];
        }
    }

    // 임시보관소에서 결과용 메모리로 복사 
    for(int i=start; i<=end; i++) {
        src[i] = tmp[i];
    }
}


public static void printArray(int[] a) {
    for (int i=0;i<a.length;i++)
        System.out.print(a[i]+" ");
    System.out.println();
}

 

 

 

'코딩테스트 > 분할 정복' 카테고리의 다른 글

쿼드 트리 압축하기  (0) 2023.08.07
쿼드 트리 뒤집기 (문제 ID: QUADTREE, 난이도: 하)  (0) 2023.08.03
Quick sort  (0) 2023.08.01