계속지나가기
코딩스뮤
계속지나가기
전체 방문자
오늘
어제
  • 코딩스뮤:)
    • Algorithm
      • 백준 문제풀이
      • 프로그래머스 문제풀이
      • 알고리즘 이론
      • 자료구조
      • SW Expert Academy
    • 인공지능(AI)
      • LLMs
      • 자연어처리(NLP)
      • 컴퓨터비전(CV)
      • 딥러닝(DL)
      • 머신러닝(ML)
      • 인공지능기초수학
      • 선형대수학
    • 컴퓨터 세팅
    • Computer Science
      • 유닉스프로그래밍
      • 프로그래밍언어론
      • 디자인패턴
      • 클린코드
      • SW 영어
      • 리눅스
      • 논리회로
    • Server
      • Docker

블로그 메뉴

  • 홈
  • Who Am I(CV)
  • 태그

공지사항

인기 글

태그

  • DigitalImageProcessing
  • 디지털이미지처리
  • machinelearning
  • 선형회귀
  • LM
  • 네트워크플로우
  • f1-score
  • ML
  • 알고리즘
  • 비지도학습
  • networkflow
  • 경사하강법
  • 군집화
  • NLP
  • 패턴인식
  • 파이썬 클린코드
  • 최대유량
  • 기계학습
  • 머신러닝
  • 컴퓨터비전
  • 지도학습
  • ComputerVision
  • MaximumFlow
  • 비용함수
  • DIP
  • 언어모델
  • 에지검출
  • 손실함수
  • 결정경계
  • SIFT

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
계속지나가기

코딩스뮤

파이썬으로 구현하는 병합정렬(Merge Sort)
Algorithm/자료구조

파이썬으로 구현하는 병합정렬(Merge Sort)

2022. 3. 13. 23:29
반응형

Concept

병합정렬은 분할 정복(Divide and Conquer) 기법과 재귀 알고리즘을 이용한 정렬 알고리즘으로, 시간복잡도는 O(nlogn)이다

하나의 리스트를 두 개의 균등한 크기로 분할하고 분할된 부분 리스트를 정렬한 다음, 두 개의 정렬된 부분 리스트를 합하여 전체가 정렬된 리스트를 얻는 정렬방법이다.  이때 병합 정렬은 아래와 같은 분할 정복 메커니즘을 따르게 된다

 

병합정렬; 오름차순

- 분할(Divide): 입력 리스트를 같은 크기의 2개의 부분 리스트로 분할한다

- 정복(Conquer): 부분 리스트를 정렬한다

- 결합(Combine): 정렬된 부분 리스트를 하나의 리스트에 통합한다

   *이 때 그림에서 표현은 생략되었으나 부분 리스트의 크기가 1이 될 때까지 분할 후 정렬 후 합병과정을 거치게 된다

 

 

구현 코드

1) 정렬되지 않은 데이터 -> 리스트로 입력 받기

>>>27 10 12 20 25 13
unsorted_list = [int(x) for x in input().split()]

 

2) 쪼개진 부분 리스트의 길이가 1이 될때까지 분할

def merge_sort(unsorted_list):
    # 크기가 1이하면 반환
    if len(unsorted_list) <= 1:
    	return unsorted_list
     
    # 리스트를 2분할
    mid = len(unsorted_list)//2
    left = unsorted_list[:mid]
    right = unsorted_list[mid:]
    
    # 2분할한 리스트를 각각 merge sort진행
    left_ = merge_sort(left)
    right_ = merge_sort(right)
    return merge(left_, right_)

 

3) 길이가 1로 쪼개진 리스트를 순서대로 병합하여 정렬 리스트에 저장

def merge(left, right):
    i, j = 0,0
    sorted_list = []
    
    while i < len(left) and j < len(right):
    	if left[i] < right[j]:
            sorted_list.append(left[i])
            i += 1
        else:
            sorted_list.append(right[j])
            j += 1
    while i < len(left):
    	sorted_list.append(left[i])
        i += 1
    while j < len(right):
    	sorted_list.append(right[j])
        j += 1
    return sorted_list

4) 정렬결과 확인

print(merge_sort(unsorted_list))
>>>10 12 13 20 25 27

 

반응형

'Algorithm > 자료구조' 카테고리의 다른 글

파이썬으로 구현하는 퀵 정렬(Qucik Sort)  (0) 2022.03.17
파이썬으로 구현하는 덱(Deque)  (2) 2021.12.26
파이썬으로 구현하는 원형 큐(Circular Queue)  (2) 2021.12.26
[이론] 우선순위 큐 (Priority Queue)  (0) 2021.07.15
[이론] 힙(Heap)  (0) 2021.07.15
    'Algorithm/자료구조' 카테고리의 다른 글
    • 파이썬으로 구현하는 퀵 정렬(Qucik Sort)
    • 파이썬으로 구현하는 덱(Deque)
    • 파이썬으로 구현하는 원형 큐(Circular Queue)
    • [이론] 우선순위 큐 (Priority Queue)
    계속지나가기
    계속지나가기
    NLP Engineer

    티스토리툴바