병합정렬
병합정렬 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) : 입력된 두 개의 배열을 순차적으로 비교해가면 하나의 새로운 배열을 만든다. 기준으로 오름차순으로 만든다.
- 왼쪽, 오른쪽 각각의 인덱스를 만들어줘 순차적으로 비교할 수 있도록 함
- 한쪽의 배열의 정렬이 끝나면 나머지 한쪽의 배열을 최종 배열 오른쪽에 추가하여 완성
- merge_sort(arr) : 입력된 배열을 오름차순으로 정렬하여 출력하는 함수