SseopE
SseopE
SseopE
전체 방문자
오늘
어제
  • 분류 전체보기 (44)
    • Programming (3)
      • JAVA (3)
    • Spring (7)
      • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 (5)
      • Spring 공부 (0)
    • Infra (6)
      • Docker (3)
      • Kubernetes (3)
      • Kafka (0)
    • Machine Learning (2)
      • Scikit-Learn (1)
      • MLOps (1)
      • BentoML (0)
      • Kubeflow (0)
    • OS (2)
      • Linux (2)
    • Algorithm (23)
      • Sorting (7)
      • BOJ (15)
      • Programmers (0)
      • Data Structure (1)
    • 특강 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 2580번
  • 자바
  • docker
  • 2275번
  • TransformMixin
  • 1931번
  • 도커
  • Spring
  • Kubernetes
  • BaseEstimator
  • boj
  • 1541번
  • 백준
  • Spring boot
  • resource
  • java
  • container
  • 2981번
  • scikit learn
  • 스웜 모드

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
SseopE

SseopE

병합 정렬(Merge Sort)
Algorithm/Sorting

병합 정렬(Merge Sort)

2022. 2. 12. 17:33

병합 정렬

- 분할 정복 (divide & conquer) 방법을 이용한 알고리즘

- 퀵 정렬과 유사하나 차이점은 안정 정렬에 속하며 균등분할을 하는 것이 차이가 있음.

- 퀵 정렬은 정렬 후 분할한다면, 병합 정렬은 분할 후 합치면서 정렬함.

 

정렬 방법

출처 : https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html

1. 배열의 길이가 0 또는 1 일때 까지 분할(divide)함.

2. 더 이상 분할 할 수 없을 때, 병합(merge)을 시작함.

3. 분할한 두개의 배열을 순차적으로 합치는데, 합칠때 두 배열 중에서 작은 값을 찾아서 하나씩 배열에 교체해 나감. (오름차순 기준)

4. 왼쪽 배열 값과 오른쪽 배열의 값을 비교해서 작은 값을 찾아서 원본 배열값에 교체.

 

JAVA Code

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.stream.IntStream;

public class MergeSort {
    public static void merge(int arr[], int left, int right) {
        int[] L = Arrays.copyOfRange(arr, left, (left+right)/2);
        int[] R = Arrays.copyOfRange(arr,(left+right)/2, right);

        int i=0,j=0,idx=left;
        while (i < L.length && j < R.length) {
            if(L[i] < R[j]) {
                arr[idx++] = L[i++];
            } else {
                arr[idx++] = R[j++];
            }
        }

        while (i < L.length) {
            arr[idx++] = L[i++];
        }

        while (j < R.length) {
            arr[idx++] = R[j++];
        }
    }

    public static void divide(int arr[], int left, int right) {
        if (Math.abs(right-left) <= 1) {
            return;
        }

        divide(arr, left, (left + right) / 2);
        divide(arr, (left + right) / 2, right);
        merge(arr, left, right);
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int _loop = Integer.parseInt(br.readLine());

        int arr[] = new int[_loop];
        for (int i = 0; i < _loop; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }

        IntStream.range(0, arr.length).map(i -> arr[i]).forEach(System.out::print);
        System.out.println();

        divide(arr,0,arr.length);
        
        IntStream.range(0, arr.length).map(i -> arr[i]).forEach(System.out::println);
        System.out.println();
    }
}

'Algorithm > Sorting' 카테고리의 다른 글

삽입 정렬 (Insertion Sort)  (0) 2022.02.14
선택 정렬 (Selection Sort)  (0) 2022.02.14
버블 정렬 (Bubble Sort)  (0) 2022.02.14
힙 정렬 (Heap Sort)  (0) 2022.02.12
퀵 정렬(Quick Sort)  (0) 2022.02.12
    'Algorithm/Sorting' 카테고리의 다른 글
    • 선택 정렬 (Selection Sort)
    • 버블 정렬 (Bubble Sort)
    • 힙 정렬 (Heap Sort)
    • 퀵 정렬(Quick Sort)
    SseopE
    SseopE

    티스토리툴바