
병합 정렬
- 병합 정렬은 여러 개의 정렬된 자료의 집합을 병합하여 한 개의 정렬된 집합으로 만드는 방식
- 분할 정복 알고리즘을 활용
- 시간복잡도 O(nlogn)
분할 작업
병합 작업
파이썬 코드
from collections import deque; import sys; sys.stdin = open('input_분할정복_백트래킹.txt', 'r')
def merge_sort(lst):
global cnt
if len(lst) == 1:
return lst
# 왼쪽과 오른쪽을 나눔
mid = len(lst)//2
left = lst[:mid]
right = lst[mid:]
# 왼쪽 부분과 오른쪽 부분을 재귀
l = merge_sort(left)
r = merge_sort(right)
# 병합 과정 rst는 최종 return할 리스트임
rst = []
# pop(0)을 하면 실행시간이 너무 길어져서 인덱스를 사용
i = 0
j = 0
len_l = len(l)
len_r = len(r)
# 두 인덱스가 모두 범위를 벗어나면 종료
while i < len_l or j < len_r:
# i 가 len(l)과 같아진다면 왼쪽 리스트의 비교해줄 값이 더이상 없다는 뜻
# 즉, 오늘쪽의 인덱스를 순서대로 넣어주면 됨
if i == len(l):
rst.append(r[j])
j += 1
continue
if j == len(r):
rst.append(l[i])
i += 1
continue
# 왼쪽의 i인덱스가 오늘쪽의 j인덱스보다 작다면 왼쪽의 i인덱스를 append해주고 i += 1
if l[i] <= r[j]:
rst.append(l[i])
i += 1
else:
rst.append(r[j])
j += 1
return rst
for tc in range(int(input())):
N = int(input())
nums = list(map(int, input().split()))
print(merge_sort(nums))
'알고리즘 개념' 카테고리의 다른 글
N-Queen (0) | 2022.09.27 |
---|---|
BFS_시작점이 여러개 (파이썬) (0) | 2022.09.10 |
Queue 큐 (파이썬) (0) | 2022.09.03 |
DFS (깊이 우선 탐색) (파이썬) (0) | 2022.09.03 |
BFS 너비우선탐색 (파이썬) (0) | 2022.09.02 |