티스토리 뷰

프로그래밍

Java - Merge Sort 합병 정렬

두덕리온라인 2021. 6. 3. 10:45
728x90
반응형

Java로 구현한 합병 정렬입니다. 배열을 반으로 나눠서 오른쪽이 왼쪽의 숫자보다 작으면 이동시키는 것을 반복합니다.

class MergeSort {
    void mergesort(int[] array) {
        int[] helper = new int[array.length];
        mergesort(array, helper, 0, array.length - 1);
    }

    void mergesort(int[] array, int[] helper, int low, int high) {
        if (low < high) {
            int middle = (low + high) / 2;
            mergesort(array, helper, low, middle);
            mergesort(array, helper, middle + 1, high);
            merge(array, helper, low, middle, high);
        } 
    }

    void merge(int[] array, int[] helper, int low, int middle, int high) {
        // low~high 까지 복사
        for (int i = low; i <= high; i++) {
            helper[i] = array[i];
        }

        // 왼쪽 절반만 사용
        int left = low;
        int right = middle + 1;
        int current = low;

        while (left <= middle && right <= high) {
            if (helper[left] <= helper[right]) {
                array[current] = helper[left];
                left++;
            } else {// 오른쪽 값이 왼쪽 값보다 작을 경우
                array[current] = helper[right];
                right++;
            }
            current++;
        }

        // 왼쪽 나머지를 원래자리로 복사 
        int remaining = middle - left;
        for (int i = 0; i <= remaining; i++) {
            array[current + i] = helper[left + i];
        }
    }
    
    public static void main(String[] args) {
        new MergeSort().mergesort(new int[]{9, 8, 1, 5, 7, 6});
    }
}
반응형

'프로그래밍' 카테고리의 다른 글

C++ 문자열 숫자 변환하기  (0) 2021.06.28
Java - Split Array Largest Sum (Hard, LeetCode)  (0) 2021.06.26
LeetCode - MinStack  (0) 2021.06.03
LeetCode - LRU Cache  (0) 2021.06.03
LeetCode - 3Sum  (0) 2021.06.03
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday