25. 자료 구조와 알고리즘/나의 알고리즘

10. 병합정렬 (Merge Sort)

THE HEYDAZE 2021. 9. 17. 16:53

병합정렬 (Merge Sort)
public class MergeSort {

    public static void main(String[] args) {

        int[] numArr = {4, 1, 7, 3, 2, 8, 6};

        int[] results = mergeSplit(numArr);

        System.out.println(Arrays.toString(results));
    }

    private static int[] mergeSplit(int[] arr) {

        // 길이가 1개 이하 인 경우 return arr
        if (arr.length <= 1) return arr;

        // 중간 위치 값
        int medium = arr.length / 2;

        int[] left = mergeSplit(Arrays.copyOfRange(arr, 0, medium));
        int[] right = mergeSplit(Arrays.copyOfRange(arr, medium, arr.length));

        return merged(left, right); // [4][1] merge [7][3] merge
    }

    private static int[] merged(int[] left, int[] right) {
        int lp = 0, rp = 0, mergeIdx = 0; // 투 포인터

        int[] merged = new int[left.length + right.length]; // left 와 right 사이즈만큼의 배열 생성

        while (left.length > lp && right.length > rp) { // 왼쪽 배열의 크기 보다 lp 가 작은 경우 and 오른쪽 배열 크기 보다 rp 가 작은 경우
            if (left[lp] > right[rp]) { // 왼쪽 값이 오른쪽 값보다 큰 경우
                merged[mergeIdx++] = right[rp++]; // merge 배열과 right 배열 의 index 증가
            } else {
                merged[mergeIdx++] = left[lp++]; // merge 배열과 left 배열 의 index 증가
            }
        }

        // 왼쪽 크기보다 lp 가 작은 경우 나머지 왼쪽에 있는 걸 리스트에 넣는다
        while (left.length > lp) {
            merged[mergeIdx++] = left[lp++];
        }
        // 오른쪽 크기보다 rp 가 작은 경우 나머지 왼쪽에 있는 걸 리스트에 넣는다
        while (right.length > rp) {
            merged[mergeIdx++] = right[rp++];
        }

        return merged;
    }
}

 

 

참고
 

[알고리즘] Java로 구현하는 쉬운 Merge Sort (병합 정렬, 합병 정렬)

알고리즘을 시작할 때 가장 먼저 배워야 할 것은 정렬, 즉 sorting이라고 생각한다. 버블 정렬, 선택 정렬, 퀵 정렬 등 많은 정렬이 있지만, 내가 사용하는 것은 병합 정렬이다. 병합 정렬(=합병 정

yunmap.tistory.com

 

 

[Algorithm] 각 정렬의 특징 및 장단점 & 시간복잡도

 정렬 별 특징 선택정렬 (Selection Sort) 선택정렬은 앞에서부터 차례대로 정렬하는 방법입니다. 먼저 주어진 리스트 중에 최소값을 찾고 그 값을 맨 앞에 위치한 값과 교체하는 방식으로 진행하

coding-factory.tistory.com