반응형
Keywords : 분할, 정복, 합병 정렬
분할 정복 알고리즘
- 주어진 문제의 입력을 분할
- 분할한 입력을 계산
- 각 해를 취합해 해를 얻음
- 부분문제는 더 이상 분할할 수 없을 때까지 분할
- 입력 크기가 n일 때 분할 횟수는 log2n
- 부분문제 수, 부분문제 크기에 따른 분류
- 부분문제 a개, 부분문제 크기 1/b로 감소 : 합병 정렬
- 부분문제 2개, 부분문제 크기 일정하지 않음 : 퀵 정렬
- 부분문제 2개이지만 하나는 버림, 부분문제 크기 1/2로 감소 : 이진탐색*
- 부분문제 2개이지만 하나는 버림, 부분문제 크기 일정하지 않음 : 선택 문제 알고리즘
- 부분문제 크기 1,2개씩 감소 : 삽입 정렬*
# 분할 정복 알고리즘 구현
def merge_sort(a):
n = len(a)
if n <= 1:
return a
mid = n // 2
g1 = merge_sort(a[:mid])
g2 = merge_sort(a[mid:])
result = []
while g1 and g2:
if g1[0] < g2[0]:
result.append(g1.pop(0))
else:
result.append(g2.pop(0))
while g1:
result.append(g1.pop(0))
while g2:
result.append(g2.pop(0))
return result
d = [6, 8, 3, 9, 10, 1, 2, 4, 7, 5]
print(merge_sort(d))
합병 정렬
- 부분문제 2개, 부분문제 크기 1/2로 감소
- 2개로 정렬된 숫자 배열을 하나의 배열로 합치는 것
- 합병 별 비교 횟수 : O(n)
- 합병 정렬의 시간 복잡도 : 층수 * O(n) = log2n * O(n) = O(nlogn)
- 장점 : 삽입 정렬 복잡도보다 낮아 자료 개수 많을 수록 유리
- 단점 : 입력을 위한 메모리 공간 외 추가로 입력과 공간과 같은 크기의 공간이 별도로 필요
<코드>
반응형
'대학교 공부 > 알고리즘 (2022)' 카테고리의 다른 글
알고리즘 6주차 - 정렬 알고리즘 (0) | 2022.10.27 |
---|---|
알고리즘 5주차 - 최근접 점의 쌍 찾기 알고리즘 (0) | 2022.10.26 |
알고리즘 4주차 - 알고리즘 시간복잡도 (0) | 2022.10.26 |
알고리즘 4주차 - 재귀 (0) | 2022.10.26 |
알고리즘 3주차 - 스택 및 큐 응용 (0) | 2022.10.26 |