[파이썬] 병합 정렬 (Merge Sort)의 구현과 특징

병합 정렬은 정렬 알고리즘 중에서 가장 효율적인 알고리즘 중 하나입니다. 이 알고리즘은 주어진 배열을 반으로 나눈 후, 각각의 반을 재귀적으로 정렬한 뒤, 정렬된 두 개의 반을 병합하여 최종적으로 정렬된 배열을 얻는 방식으로 동작합니다.

구현

병합 정렬을 Python으로 구현하는 방법을 알아보겠습니다.

def merge_sort(arr):
    if len(arr) <= 1:
        return arr
    
    mid = len(arr) // 2
    left_half = arr[:mid]
    right_half = arr[mid:]
    
    left_half = merge_sort(left_half)
    right_half = merge_sort(right_half)
    
    return merge(left_half, right_half)
    
def merge(left, right):
    merged = []
    left_idx, right_idx = 0, 0
    
    while left_idx < len(left) and right_idx < len(right):
        if left[left_idx] < right[right_idx]:
            merged.append(left[left_idx])
            left_idx += 1
        else:
            merged.append(right[right_idx])
            right_idx += 1
    
    while left_idx < len(left):
        merged.append(left[left_idx])
        left_idx += 1
    
    while right_idx < len(right):
        merged.append(right[right_idx])
        right_idx += 1
        
    return merged

위의 코드에서 merge_sort 함수는 주어진 배열을 반으로 나눈 뒤, 각각의 반을 재귀적으로 merge_sort 함수를 호출하여 정렬한 뒤, merge 함수를 통해 두 개의 정렬된 배열을 병합하여 최종적으로 정렬된 배열을 반환합니다.

merge 함수는 두 개의 정렬된 배열을 받아서 하나의 정렬된 배열로 병합하는 역할을 합니다. 두 개의 정렬된 배열의 원소들을 차례대로 비교하면서 작은 값을 결과 배열에 추가합니다.

특징

병합 정렬은 다음과 같은 특징을 가지고 있습니다:

병합 정렬은 대부분의 상황에서 효율적인 알고리즘으로 사용될 수 있으며, 이미 정렬되어 있는 배열의 정렬이나 대량의 데이터를 정렬하는데 유용합니다. 그러나 정렬을 위한 추가적인 배열을 필요로 하기 때문에 메모리 사용량이 크다는 단점이 있습니다.