우규이인우윀
Eager To Learn 🌌
우규이인우윀
전체 방문자
였늘
μ–΄μ œ

λΈ”λ‘œκ·Έ 메뉴

  • 🏑 ν™ˆ
  • πŸš€ κΉƒν—ˆλΈŒ
  • β›… νƒœκ·Έ ν΄λΌμš°λ“œ
  • λΆ„λ₯˜ 전체보기 (217)
    • πŸ‘¨πŸ»β€πŸ’» PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm 기법 (1)
      • 바킹독 (21)
    • λΈ”λ‘œκ·Έ 이사 (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • 자료ꡬ쑰 (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • κ°œλ°œμ„œμ  (15)
      • 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 (1)
      • 였브젝트 - 쑰영호 (7)
      • μΉœμ ˆν•œ SQL νŠœλ‹ (7)
    • 회고 (2)
hELLO Β· Designed By μ •μƒμš°.
우규이인우윀
CS/자료ꡬ쑰

병합 μ •λ ¬ (Merge Sort) 을 κ΅¬ν˜„ν•΄λ³΄μž

CS/자료ꡬ쑰

병합 μ •λ ¬ (Merge Sort) 을 κ΅¬ν˜„ν•΄λ³΄μž

2023. 9. 3. 14:52

정렬을 ν•  수 μžˆλŠ” 방법은 μ—¬λŸ¬κ°€μ§€κ°€ μžˆλ‹€.

 

λŒ€ν‘œμ μœΌλ‘œ λ‹€μŒκ³Ό 같은 방법이 μžˆλ‹€.

 

πŸ’‘ μ •λ ¬μ˜ μ’…λ₯˜μ™€ 방식

1. 버블 μ •λ ¬ : 2개의 μ›μ†Œλ₯Ό 계속 λΉ„κ΅ν•΄λ‚˜κ°€λ©° 값이 큰 μ›μ†Œκ°€ μ•žμ— μžˆλŠ” 경우 μœ„μΉ˜λ₯Ό κ΅ν™˜ν•œλ‹€. 제일 큰 κ°’(μ˜€λ¦„μ°¨μˆœμ˜ 경우)을 제일 λ’€λ‘œ 보내어 μ΅œμ’…μ μœΌλ‘œ μ •λ ¬λœλ‹€. μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N^2)으둜 λ³Ό 수 μžˆλ‹€. λ§Œμ•½ ν•œλ²ˆ μˆœνšŒν–ˆμ„ λ•Œ 두 μ›μ†Œκ°„ μœ„μΉ˜κ°€ λ³€ν•œ 적이 μ—†λ‹€λ©΄ 순회λ₯Ό λΉ μ Έλ‚˜κ°€λŠ” λ°©μ‹μœΌλ‘œ μ΅œμ ν™”λ₯Ό ν•  수 μžˆλ‹€.

2. 선택 μ •λ ¬ : μ›μ†Œλ“€μ„ μˆœνšŒν•˜μ—¬ κ°€μž₯ μž‘μ€ 값을 찾은 λ’€(선택), 제일 μ•ž μ›μ†Œμ™€ μœ„μΉ˜λ₯Ό λ°”κΏˆμœΌλ‘œμ„œ μž‘μ€ 값이 계속 μ•žμœΌλ‘œ μ΄λ™ν•˜λ©΄μ„œ μ΅œμ’…μ μœΌλ‘œ μ •λ ¬λœλ‹€. μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N^2)으둜 λ³Ό 수 μžˆλ‹€.

3. μ‚½μž… μ •λ ¬ : 2번째 μ›μ†ŒλΆ€ν„° μ‹œμž‘ν•΄μ„œ N번째 μ›μ†ŒκΉŒμ§€ N-1κΉŒμ§€μ˜ μ •λ ¬λœ 배열에 정렬을 μœ μ§€ν•  수 μžˆλŠ” μœ„μΉ˜λ₯Ό μ°Ύμ•„ μ‚½μž…ν•˜λŠ” 정렬이닀. μ‹œκ°„ λ³΅μž‘λ„λŠ” O(N^2)이고, 이미 μ–΄λŠμ •λ„ μ •λ ¬λ˜μ–΄μžˆμ„λ•Œ 효율적으둜 λ™μž‘ν•  수 μžˆλ‹€.

 

μœ„ 방식은 μ΅œλŒ€ μ‹œκ°„ λ³΅μž‘λ„κ°€ O(N^2)이 λœλ‹€.

 

ν•˜μ§€λ§Œ, 병렬 정렬을 μ‚¬μš©ν•˜λ©΄ O(NlogN) μ‹œκ°„ λ³΅μž‘λ„λ‘œ 정렬을 μˆ˜ν–‰ν•  수 μžˆλ‹€.

 

총 μ›μ†Œκ°€ N개인 배열을 반볡적으둜 λΆ„ν• ν•˜μ—¬ μ΅œλŒ€ν•œ μž‘κ²Œ μͺΌκ° λ‹€μŒμ—, μΈμ ‘ν•œ μ›μ†Œλ“€λΌλ¦¬ λΉ„κ΅ν•˜μ—¬ μ •λ ¬ν•˜λŠ” 방식이닀.

 

μͺΌκ°œμ§„ 쑰각듀을 ν•©μΉ  λ•Œ, μ •λ ¬ν•΄μ„œ ν•©μΉ¨μœΌλ‘œμ„œ μ΅œμ’…μ μœΌλ‘œ μ •λ ¬λœλ‹€.

 

κ΅¬ν˜„

 

1. λΆ„ν•  μž‘μ—…

2. λΆ„ν• λœ μ›μ†Œλ“€μ„ μ •λ ¬ν•˜μ—¬ ν•©μΉ˜λŠ” μž‘μ—…

 

μœ„ 두가지 μž‘μ—…μœΌλ‘œ λΆ„λ¦¬ν•΄μ„œ μƒκ°ν•˜λ©΄ 쉽닀.

 

λΆ„ν•  μž‘μ—…

	 private static void mergeSort(int[] arr, int left, int right) {
        if (right - left <= 1) {
            return;
        }

        int mid = (left + right) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid, right);
        merge(arr, left, mid, right);
    }

 

λΆ„ν• ν•  수 없을 λ•ŒκΉŒμ§€ λΆ„ν• ν•˜κ³  merge λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€.

 

merge λ©”μ„œλ“œλŠ” λΆ„ν• λœ 두 배열을 μ •λ ¬ν•˜μ—¬ ν•©μΉ˜λŠ” λ©”μ„œλ“œμ΄λ‹€.

 

병합 μž‘μ—…

    private static void merge(int[] arr, int left, int mid, int right) {
        int[] temp = new int[right - left];
        int idx = 0, l = left, r = mid;

        while (l < mid && r < right) {
            if (arr[l] < arr[r]) {
                temp[idx++] = arr[l++];
            } else {
                temp[idx++] = arr[r++];
            }
        }

        while (l < mid) {
            temp[idx++] = arr[l++];
        }

        while (r < right) {
            temp[idx++] = arr[r++];
        }

        for (int i = left; i < right; i++) {
            arr[i] = temp[i - left];
        }
    }

μž„μ‹œ 배열을 μ΄ˆκΈ°ν™”ν•˜κ³ , 첫번째 쑰건문으둜 두 λ°°μ—΄μ˜ μ›μ†Œ 크기에 따라 μž„μ‹œ 배열에 μž…λ ₯ν•˜κ³ 

 

미처 μž…λ ₯λ˜μ§€ λͺ»ν•œ μ›μ†Œλ“€κΉŒμ§€ μˆœμ„œλŒ€λ‘œ μž…λ ₯ν•΄μ€€λ‹€.

 

그리고, μ‹€μ œ λ°°μ—΄ arr에 λ°˜μ˜μ‹œμΌœμ£Όλ©΄ λœλ‹€.

 

κ²°κ³Ό 확인

import java.util.Arrays;
import java.util.Random;

public class MergeSort {
    public static void main(String[] args) {
        int[] arr = new int[30];
        Random rand = new Random();
        for (int i = 0; i < 30; i++) {
            arr[i] = rand.nextInt(100);
        }

        System.out.println(Arrays.toString(arr));

        mergeSort(arr, 0, arr.length);

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

    private static void mergeSort(int[] arr, int left, int right) {
        if (right - left <= 1) {
            return;
        }

        int mid = (left + right) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid, right);
        merge(arr, left, mid, right);
    }

    private static void merge(int[] arr, int left, int mid, int right) {
        int[] temp = new int[right - left];
        int idx = 0, l = left, r = mid;

        while (l < mid && r < right) {
            if (arr[l] < arr[r]) {
                temp[idx++] = arr[l++];
            } else {
                temp[idx++] = arr[r++];
            }
        }

        while (l < mid) {
            temp[idx++] = arr[l++];
        }

        while (r < right) {
            temp[idx++] = arr[r++];
        }

        for (int i = left; i < right; i++) {
            arr[i] = temp[i - left];
        }
    }

}

μœ„ μ½”λ“œλ₯Ό μ‹€ν–‰ν•΄λ³΄λ‹ˆ μ•„λž˜μ™€ 같이 잘 정렬됨을 확인할 수 μžˆμ—ˆλ‹€.

 

κ°„ν˜Ή, O(NlogN) μ‹œκ°„λ³΅μž‘λ„λ‘œ 정렬을 μˆ˜ν–‰ν•  ν•„μš”κ°€ μžˆμ„ λ•Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ κΌ­ κΈ°μ–΅ν•˜κ³  μžˆμ–΄μ•Όκ² λ‹€.

  • κ΅¬ν˜„
  • κ²°κ³Ό 확인
'CS/자료ꡬ쑰' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • Hash μžλ£Œκ΅¬μ‘°μ™€ ν•΄μ‹œ 좩돌
  • Linked List κ΅¬ν˜„ν•΄λ³΄κΈ°
우규이인우윀
우규이인우윀
개발자 κΏˆλ‚˜λ¬΄

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”

단좕킀

λ‚΄ λΈ”λ‘œκ·Έ

λ‚΄ λΈ”λ‘œκ·Έ - κ΄€λ¦¬μž ν™ˆ μ „ν™˜
Q
Q
μƒˆ κΈ€ μ“°κΈ°
W
W

λΈ”λ‘œκ·Έ κ²Œμ‹œκΈ€

κΈ€ μˆ˜μ • (κΆŒν•œ μžˆλŠ” 경우)
E
E
λŒ“κΈ€ μ˜μ—­μœΌλ‘œ 이동
C
C

λͺ¨λ“  μ˜μ—­

이 νŽ˜μ΄μ§€μ˜ URL 볡사
S
S
맨 μœ„λ‘œ 이동
T
T
ν‹°μŠ€ν† λ¦¬ ν™ˆ 이동
H
H
단좕킀 μ•ˆλ‚΄
Shift + /
⇧ + /

* λ‹¨μΆ•ν‚€λŠ” ν•œκΈ€/영문 λŒ€μ†Œλ¬Έμžλ‘œ 이용 κ°€λŠ₯ν•˜λ©°, ν‹°μŠ€ν† λ¦¬ κΈ°λ³Έ λ„λ©”μΈμ—μ„œλ§Œ λ™μž‘ν•©λ‹ˆλ‹€.