Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- class
- typeORM
- game
- nestjs
- TypeScript
- cookie
- 공룡게임
- Queue
- OCR
- Dinosaur
- react
- Python
- dfs
- Nest.js
- Sequelize
- MongoDB
- mongoose
- GIT
- 게임
- 자료구조
- jest
- MySQL
- AWS
- Bull
- 정렬
- Express
- nodejs
- JavaScript
- flask
Archives
- Today
- Total
포시코딩
병합 정렬(Merge Sort) - 복습필요 본문
728x90
병합 정렬(Merge Sort)
- 분할 정복 알고리즘의 기법을 사용하는 정렬 알고리즘 중 하나
(분할 정복 알고리즘의 대표적인 예 중 하나기도 하다.) - 데이터를 잘게 쪼개 정렬한다.
- Memoization을 사용하지 않음
- 재귀 용법을 활용
사용방법
- 리스트를 절반으로 잘라 비슷한 크기의 두 부분 리스트로 나눈다.
- 각 부분 리스트를 재귀적으로 병합 정렬을 이용해 정렬한다.
- 두 부분 리스트를 다시 하나의 정렬된 리스트로 병합한다.
구현
재귀 용법으로 데이터를 나누는 함수, 나눠진 데이터를 병합하는 함수
두 단계를 함수로 만들어 사용
def merge_sort(data):
return split(data)
def split(data):
if len(data) <= 1:
return data
medium = int(len(data) / 2)
left = split(data[:medium])
right = split(data[medium:])
return merge(left, right)
def merge(left, right):
merged = []
lp, rp = 0, 0
# Case 1. left/right 둘 다 아직 남아있을 때
while len(left) > lp and len(right) > rp:
if left[lp] > right[rp]:
merged.append(right[rp])
rp += 1
else:
merged.append(left[lp])
lp += 1
# Case 2. left만 남아있을 때
while len(left) > lp:
merged.append(left[lp])
lp += 1
# Case 3. right만 남아있을 때
while len(right) > rp:
merged.append(right[rp])
rp += 1
return merged
import random
data_list = random.sample(range(100), 10)
print(merge_sort(data_list))
분석
한 단계(depth)에 대해
각 노드의 계산양: n / 2i
노드 개수: 2i
즉, 각 단계는 항상 O(n)의 시간복잡도를 가진다.
단계는 항상 log2n개 만큼 만들어지므로 상수 떼고
단계가 만들어지는 시간복잡도는 O(log n)
따라서, 총 시간복잡도는 O(n) * O(log n) = O(n log n)이 된다.
728x90
'자료구조알고리즘 > 이론' 카테고리의 다른 글
그래프(Graph) (0) | 2023.04.14 |
---|---|
탐색 알고리즘 - 이진 탐색(Binary Search) (0) | 2023.04.14 |
퀵 정렬(Quick Sort) (0) | 2023.04.13 |
동적 계획법(DP), 분할 정복(Divide and Conquer) (0) | 2023.04.13 |
재귀 활용 - 회문(팰린드롬), 더하기 조합 (0) | 2023.04.13 |