/ PROGRAMING, PYTHON

병합정렬

병합정렬 Merge Sorting

분할 정복(divide and conquer) 알고리즘의 대표적인 예시로, 배열을 두 부분으로 분할한 뒤, 각각을 재귀적으로 정렬하여, 합쳐서 정렬된 배열을 생성하는 방법

병합정렬 1

def merge_sort(arr):
    # 병합하기 위한 함수로 입력된 배열은 오름차순으로 정렬된다.
    
    # 병합의 최소 조건은 배열의 크기가 2 이상
    if len(arr) <= 1:
        return arr
    
    # 분할 지점 설정 
    mid = len(arr) // 2
    left = arr[:mid]
    right = arr[mid:]
    
    # 재귀적으로 분할된 구역을 나눈다.
    left = merge_sort(left)
    right = merge_sort(right)
    
    return merge( left, right )

def merge(left, right):
    # 정렬하기 위한 함수로 입련된 두 개의 배열을 순차적으로 비교해가면 하나의 새로운 오름차순으로 정렬된 배열을 만든다.
    
    result = [] # 정렬된 숫자
    i = 0 # left index
    j = 0 # right index
    
    # 한쪽씩 비교하면서 작은 수를 result에 집어 넣는다.
    while i < len(left) and j < len(right) :
        if left[i] <= right[j] :
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j+=1
    
    # 남은 것이 있으면 result에 추가 정리
    result += left[i:]
    result += right[j:]
    
    return result
  • 알고리즘
    • merge_sort(arr) : 입력된 배열을 오름차순으로 정렬하여 출력하는 함수
      • 병합정렬의 최소 조건은 배열의 크기가 2개 이상인 기준
      • 왼쪽과 오른쪽 부분으로 분할하여 정렬하는데 일반적으로 전체 길이의 절반의 인덱스를 기준
    • merge(left, right) : 입력된 두 개의 배열을 순차적으로 비교해가면 하나의 새로운 배열을 만든다. 기준으로 오름차순으로 만든다.
      • 왼쪽, 오른쪽 각각의 인덱스를 만들어줘 순차적으로 비교할 수 있도록 함
      • 한쪽의 배열의 정렬이 끝나면 나머지 한쪽의 배열을 최종 배열 오른쪽에 추가하여 완성