병합 정렬 [Merge Sort]
참고
Merge Sort
하나의 리스트를 두 개의 균등한 크기로 분할하고 분할된 부분 리스트를 정렬한 다음, 두 개의 정렬된 부분 리스트를 합하여 전체가 정렬된 리스트가 되게 하는 방법임.
합병 정렬은 다음의 단계들로 이루어짐.
- 분할(Divide)
- 입력 배열을 같은 크기의 2개의 부분 배열로 분할한다.
- 정복(Conquer)
- 부분 배열을 정렬, 부분 배열의 크기가 충분히 작지 않으면 순환 호출을 이용하여 다시 분할 정복 방법을 적용함.
- 결합(Combine)
- 정렬된 부분 배열들을 하나의 배열에 합병함.
과정 요약
리스트 길이가 0 또는 1이면 이미 정렬된 것으로 봄.
그렇지 않은 경우에는 정렬되지 않은 리스트를 절반으로 잘라 비슷한 크기의 두 부분 리스트로 나눔.
각 부분 리스트를 재귀적으로 합병 정렬을 이용해 정렬함.
두 부분 리스트를 다시 하나의 정렬된 리스트로 합병함.
시간복잡도는 O(nlogn)
, 단점은 정렬된 데이터 배열을 담을 새로운 배열이 필요하여 추가적인 메모리가 사용된다는 점임.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def merge(larr,rarr) :
i=j=0
temp=[]
while i < len(larr) and j < len(rarr) :
if larr[i] <= rarr[j] :
temp.append(larr[i])
i+=1
else :
temp.append(rarr[j])
j+=1
temp+=larr[i:]
temp+=rarr[j:]
return temp
def merge_sort(arr) :
if len(arr) < 2 :
return arr
mid=len(arr)//2
larr=merge_sort(arr[:mid])
rarr=merge_sort(arr[mid:])
return merge(larr,rarr)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 가져온 코드
def merge_sort(arr):
if len(arr) < 2:
return arr
mid = len(arr) // 2
low_arr = merge_sort(arr[:mid])
high_arr = merge_sort(arr[mid:])
merged_arr = []
l = h = 0
while l < len(low_arr) and h < len(high_arr):
if low_arr[l] < high_arr[h]:
merged_arr.append(low_arr[l])
l += 1
else:
merged_arr.append(high_arr[h])
h += 1
merged_arr += low_arr[l:]
merged_arr += high_arr[h:]
return merged_arr
This post is licensed under CC BY 4.0 by the author.