이 영역을 누르면 첫 페이지로 이동
Daily Growth 블로그의 첫 페이지로 이동

Daily Growth

페이지 맨 위로 올라가기

Daily Growth

Loving you is the reason I live. That’s why every day is precious, a step toward my dreams and you.

병합 정렬(Merge Sort) : 효율적인 정렬 알고리즘 배우기

  • 2025.03.25 13:04
  • IT

병합 정렬이란?

지난 강의에서 다양한 정렬 알고리즘을 배웠다. 선택 정렬, 버블 정렬 등은 이해하기 쉽지만, 실행 시간이 상대적으로 오래 걸린다. 이번에는 보다 효율적인 정렬 방법인 병합 정렬(Merge Sort) 에 대해 알아보자.

병합 정렬은 분할 정복(Divide and Conquer) 기법을 활용하는 정렬 알고리즘이다. 데이터를 반씩 나누고, 더 이상 나눌 수 없을 때까지 나눈 후, 다시 정렬하면서 합쳐나간다. 이러한 방식 덕분에 시간 복잡도가 O(n log n) 으로, 이전에 배운 선택 정렬(O(n²))보다 훨씬 빠르다.

 

병합 정렬의 동작 방식 🔍

1. 데이터 분할하기

정렬할 숫자들이 있다고 가정하자.

7 4 5 2 6 3 8 1

이 숫자들을 반으로 나눈다.

7 4 5 2 | 6 3 8 1

반으로 나눈 데이터 중 왼쪽 부분을 다시 반으로 나눈다.

7 4 | 5 2 | 6 3 8 1

한 번 더 나누면 다음과 같이 된다.

7 | 4 | 5 2 | 6 3 8 1

이제 숫자가 한 개씩 남을 때까지 계속 나눈다.

 

2. 정렬하며 병합하기 🛠

이제 숫자가 하나씩 남았으니, 다시 정렬하면서 병합 한다.

4와 7을 비교해서 작은 숫자가 먼저 오도록 정렬한다.

4 7 | 5 2 | 6 3 8 1

5와 2도 정렬한다.

4 7 | 2 5 | 6 3 8 1

이제 4 7과 2 5를 병합한다. 각 숫자를 차례로 비교하여 작은 숫자부터 배치 한다.

2 4 5 7 | 6 3 8 1

오른쪽 부분도 같은 과정을 거쳐 정렬한다.

2 4 5 7 | 1 3 6 8

마지막으로 두 부분을 병합하면 정렬이 완료된다.

1 2 3 4 5 6 7 8

 

 

병합 정렬의 시간 복잡도 ⏳

병합 정렬의 시간 복잡도는 O(n log n) 이다.

  • 데이터를 반으로 나누는 과정 → O(log n)
  • 나눈 데이터를 병합하는 과정 → O(n)
  • 따라서 전체 시간 복잡도는 O(n log n) 이다.

이는 선택 정렬(O(n²))이나 버블 정렬(O(n²))보다 훨씬 효율적이다.

병합 정렬의 장점과 단점 📌

✅ 장점

  • 빠르다: O(n log n)으로 대부분의 경우 선택 정렬, 버블 정렬보다 훨씬 빠름.
  • 안정 정렬(Stable Sort): 동일한 값이 있을 때 기존 순서를 유지함.
  • 큰 데이터에도 효율적: 입력 크기가 커질수록 장점이 더 두드러짐.

❌ 단점

  • 추가적인 메모리 사용: 배열을 분할하고 병합하는 과정에서 O(n) 의 추가 공간이 필요함.
  • 재귀 호출로 인한 오버헤드: 재귀를 많이 사용하기 때문에 호출 스택의 부담이 있을 수 있음.

+ 정리 

  • 병합 정렬은 분할 정복(Divide and Conquer) 알고리즘 을 활용하여 데이터를 정렬한다.
  • 실행 시간은 O(n log n) 으로 선택 정렬이나 버블 정렬보다 효율적이다.
  • 추가적인 메모리 공간(O(n)) 이 필요하지만, 정렬 속도가 빠르고 안정적인 장점이 있다.
반응형

'IT' 카테고리의 다른 글

인터넷 속도 계산법 : 1Gbps, 100Mbps 다운로드 속도 비교  (0) 2025.03.28
C 프로그래밍에서 16진수와 메모리 주소 이해하기: 포인터와 역참조까지  (0) 2025.03.27
C 언어로 재귀와 반복문을 사용한 피라미드 그리기  (0) 2025.03.24
정렬 알고리즘 완벽 이해: Big O와 Big Ω로 실행 시간 최적화하기(:  (0) 2025.03.24
선택 정렬 완벽 이해: 장점, 단점 및 성능 비교 | O(n²) 알고리즘  (0) 2025.03.24

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 인터넷 속도 계산법 : 1Gbps, 100Mbps 다운로드 속도 비교

    인터넷 속도 계산법 : 1Gbps, 100Mbps 다운로드 속도 비교

    2025.03.28
  • C 프로그래밍에서 16진수와 메모리 주소 이해하기: 포인터와 역참조까지

    C 프로그래밍에서 16진수와 메모리 주소 이해하기: 포인터와 역참조까지

    2025.03.27
  • C 언어로 재귀와 반복문을 사용한 피라미드 그리기

    C 언어로 재귀와 반복문을 사용한 피라미드 그리기

    2025.03.24
  • 정렬 알고리즘 완벽 이해: Big O와 Big Ω로 실행 시간 최적화하기(:

    정렬 알고리즘 완벽 이해: Big O와 Big Ω로 실행 시간 최적화하기(:

    2025.03.24
다른 글 더 둘러보기

정보

Daily Growth 블로그의 첫 페이지로 이동

Daily Growth

  • Daily Growth의 첫 페이지로 이동

검색

메뉴

    카테고리

    • 분류 전체보기 (432)
      • Design History (69)
      • IT (134)
      • Typography (13)
      • UX • UI Design (10)
      • Money (62)
      • Health (53)
      • Words (6)
      • Reading (20)
      • English (64)

    나의 외부 링크

    • lody.design
    • lody.canada
    • lody.study
    • lody.diary

    정보

    self-improvement의 Daily Growth

    Daily Growth

    self-improvement

    블로그 구독하기

    • 구독하기
    • 네이버 이웃 맺기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. Copyright © self-improvement.

    티스토리툴바