[알고리즘] 합병 정렬이란? (개념, 파이썬 코드)

2024. 4. 11. 22:33·알고리즘
728x90

합병 정렬(Merge Sort)이란?

배열을 2개의 하위 배열로 재귀적으로 나눈 후, 다시 각 배열을 합치면서 정렬한다.

분할 정복 (Divide and Conquer)에 해당한다.

*분할 정복이란?

문제를 작게 분할한 후 각각을 해결하고, 그 결과를 이용해 전체 문제를 해결하는 알고리즘

  • 방법
    • 주어진 배열을 균등한 크기의 2개의 배열로 분할한다.
    • 분할된 부분 배열을 반복해서 2개의 배열로 분할한다.
    • 더 이상 분할할 수 없을 때, 다시 2개의 배열을 합쳐서 정렬한다. ([3], [1] -> [1, 3])
    • 재귀적으로 정렬된 부분 배열을 하나로 합치면서 전체가 정렬된 배열을 만든다. ([1, 3], [2, 4] -> [1, 2, 3, 4])

 

파이썬으로 구현하기

def merge_sort(arr, start, end):
    if start >= end:
        return

    mid = (start + end) // 2

    merge_sort(arr, start, mid)
    merge_sort(arr, mid + 1, end)
    merge(arr, start, mid, end)

def merge(arr, start, mid, end):
    i, j = start, mid + 1
    sorted_arr = []

    while i <= mid and j <= end:
        if arr[i] < arr[j]:
            sorted_arr.append(arr[i])
            i += 1
        else:
            sorted_arr.append(arr[j])
            j += 1

    while i <= mid:
        sorted_arr.append(arr[i])
        i += 1

    while j <= end:
        sorted_arr.append(arr[j])
        j += 1

    arr[start:end + 1] = sorted_arr


if __name__ == "__main__":
    arr = [1,6,4,2,3,5]

    print(f"before : {arr}")  # 정렬 전 리스트
    merge_sort(arr, 0, len(arr)-1)
    print(f"after : {merged_arr}")  # 정렬 후 리스트


시간 복잡도

입력 데이터의 크기가 N일 때,

알고리즘의 연산 횟수는 아래와 같다.

  • 배열 분할 작업
    • 균등한 크기로 2개의 배열로 반복해서 나누기 때문에, log n번 반복한다.
  • 배열 병합 작업
    • 더이상 나누어지지 않을 때까지 분할한 후, 다시 2개의 배열을 합치면서 정렬하는 과정이다.
    • 리스트의 크기가 1인 상태일 때, 크기가 1인 배열이 총 N개 있다.
    • 이 N개의 크기를 비교하면서 2개씩 합쳐진 배열을 만들기 때문에, N번 비교연산한다.
    • N/4 크기의 배열일 때도, 4개의 배열이 존재하기 때문에 N/4*4=N번 비교연산한다.
  • 결과
    • 따라서 합병 정렬의 시간 복잡도는 O(N logN) 이다.
728x90

'알고리즘' 카테고리의 다른 글

[알고리즘] 깊이 우선 탐색(DFS)이란? (개념, 예제, python)  (0) 2024.04.22
[알고리즘] 퀵 정렬이란? (개념, 파이썬 코드)  (0) 2024.04.11
[알고리즘] 삽입 정렬이란? (개념, 파이썬 코드)  (0) 2024.04.10
[알고리즘] 선택 정렬이란? (개념, 파이썬 코드)  (1) 2024.04.10
[알고리즘] 버블 정렬이란? (개념, 파이썬 코드)  (0) 2024.04.10
'알고리즘' 카테고리의 다른 글
  • [알고리즘] 깊이 우선 탐색(DFS)이란? (개념, 예제, python)
  • [알고리즘] 퀵 정렬이란? (개념, 파이썬 코드)
  • [알고리즘] 삽입 정렬이란? (개념, 파이썬 코드)
  • [알고리즘] 선택 정렬이란? (개념, 파이썬 코드)
kiminae
kiminae
공부한 내용을 정리합니다.
  • kiminae
    데이터 다루는 사람
    kiminae
  • 전체
    오늘
    어제
    • 분류 전체보기 (67)
      • AI & 빅데이터 (6)
        • kafka (10)
        • [Book] 빅데이터를 지탱하는 기술 (12)
      • 알고리즘 (19)
      • 알고리즘 문제풀이 (13)
        • programmers (0)
        • 백준 (1)
        • LeetCode (12)
      • Android (3)
      • Book&Lesson (13)
        • [Lesson] 프로그래머스 커뮤러닝 (Pyth.. (1)
      • 참고한 글들 (1)
      • 컨퍼런스 정리 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ViewModel
    추천알고리즘
    Algorithm
    mvvm
    릿코드
    데이터시각화
    머신러닝
    hadoop
    sort
    개인화추천
    알고리즘
    알고리즘문제
    파이프라인구축
    데이터엔지니어
    정렬
    시간복잡도
    DP문제
    카프카클라이언트
    BI도구
    MPP데이터베이스
    빅데이터를지탱하는기술
    정렬알고리즘
    리트코드
    Kafka
    leetcode
    트리
    버블정렬
    알고리즘풀이
    카프카
    빅데이터
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
kiminae
[알고리즘] 합병 정렬이란? (개념, 파이썬 코드)
상단으로

티스토리툴바