Notice
Recent Posts
Recent Comments
반응형
Link
Toolofv 님의 블로그
[Python] 병합 정렬(Merge Sort) 본문
정렬 알고리즘은 사실 실제로 구현해서 사용할 일은 없는 것 같다. 매일 잊어먹기 때문에 기록의 용도로 올린다. 병합 정렬(Merge Sort)의 시간복잡도는 최악의 경우부터 최선의 경우 모두 $O(n\ log\ n)$이고, 공간복잡도는 $O(n)$이다. 배열의 크기에 비례하는 공간이 필요하다.
병합 정렬(Merge Sort)
병합 정렬은 배열을 재귀함수로 계속 분할하고 끝에서부터 병합하면서 정렬이 되는 구조다. 타고타고 병합이 완료되면서 정렬된다.
- 코드
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
d = [1, 6, 8, 2, 9, 3, 7, 5, 4]
def merge_sort(d):
if len(d) < 2:
return d
mid = len(d)//2
l = merge_sort(d[:mid])
r = merge_sort(d[mid:])
i, j = 0, 0
res = []
while True:
if i >= len(l) or j >= len(r):
break
if l[i] <= r[j]:
res.append(l[i])
i += 1
else:
res.append(r[j])
j += 1
if l[i:]:
res.extend(l[i:])
if r[j:]:
res.extend(r[j:])
return res
print(merge_sort(d))
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
d = [1, 6, 8, 2, 9, 3, 7, 5, 4]
def merge_sort(d):
if len(d) < 2:
return d
mid = len(d)//2
l = merge_sort(d[:mid])
r = merge_sort(d[mid:])
return merge(l, r)
def merge(l, r):
if len(l) == 0 or len(r) == 0:
return l or r
i, j = 0, 0
res = []
while True:
if i >= len(l) or j >= len(r):
break
if l[i] <= r[j]:
res.append(l[i])
i += 1
else:
res.append(r[j])
j += 1
if l[i:]:
res.extend(l[i:])
if r[j:]:
res.extend(r[j:])
return res
print(merge_sort(d))
[Python] 퀵 정렬(Quick Sort)
퀵 정렬(Quick Sort)은 병합 정렬(Merge Sort)와 비슷하게 분할정복(Divide and Conqueror)의 방법으로 정렬되는 알고리즘이다. 퀵 정렬은 시간복잡도로는 복불복이다. 최선, 평균의 경우 $O(n\ log\ n)$이지만
toolofv.tistory.com
[Python] 힙 정렬(Heap Sort)
힙(Heap) 정렬 알고리즘은 정렬의 용도로 주로 쓰인다고 볼 수는 없는 것 같다. 힙 자료구조는 원소가 들어갈 때 최댓값, 최소값을 꺼내쓰는데 효율적이기 때문에 다익스트라(dijkstra) 알고리즘같
toolofv.tistory.com
반응형
'Algorithm' 카테고리의 다른 글
[Python] 퀵 정렬(Quick Sort) (0) | 2025.01.31 |
---|---|
[Python] 힙 정렬(Heap Sort) (0) | 2025.01.28 |
[Python] 백준 - 2583 영역 구하기 (0) | 2025.01.26 |
[Python] 백준 - 2573 빙산 (1) | 2024.12.27 |
[Python] 백준 - 10026 적록색약 (0) | 2024.12.10 |