Python/알고리즘 및 자료구조

합병 정렬(merge sort)

박남수 2021. 3. 5. 21:44

분할 정복 알고리즘

 

커다란 문제를 작은 문제로 분할하여 해결해 나가는 방법론

 

 

합병정렬(merge sort) 알고리즘

 

분할 정복 알고리즘을 적용하여 정렬할 배열을 더이상 나눠질 수 없는 배열로 나누어 배열 단위별로 정렬

시간복잡도: O(n log n)

 

배열을 비교하여 정렬

tmp = [None] #임시배열
def merges(li,left,mid,right):#쪼갠 배열을 비교하여 정렬하는 메서드
    l_idx = left # 왼쪽 배열 인덱스
    r_idx = mid +1 # 오른쪽 배열 인덱스
    c_idx = left # 작은수가 들어가는 배열 현재위치
    t_idx = 0 #남은 원소를 한꺼번에 저장할때 사용할 임시 인덱스
    while l_idx <= mid and r_idx <= right: #왼쪽 인덱스가 중간인덱스보다 작고 오른쪽 인덱스가 맨 오른쪽 보다 작을경우 반복
        if li[l_idx] <= li[r_idx]: #왼쪽 값이 오른쪽 값보다 작거나 같을 경우 
            tmp[c_idx] = li[l_idx] # 임시 배열에 왼쪽 값 추가 
            c_idx = c_idx + 1 #현재 위치 값 추가
            l_idx = l_idx + 1 # 왼쪽 인덱스 추가
        else: # 오른쪽 값이 왼쪽 값보다 큰 작은 경우
            tmp[c_idx] = li[r_idx] # 임시 배열에 오른쪽 값 추가
            c_idx = c_idx + 1 
            r_idx = r_idx + 1
    # 왼쪽 인덱스가 mid 보다 커지거나 오른쪽 인덱스가 맨 오른쪽 보다 커질 경우 종료
    if l_idx > mid: # 왼쪽 인덱스가 mid 보다 커진경우 즉 오른쪽 값이 남은 경우
        for t_idx in range(r_idx,right+1,1): #남은 오른쪽 값들을 임시 배열에 추가
            tmp[c_idx] = li[t_idx] 
            c_idx = c_idx + 1
    else: # 오른쪽 인덱스가 right 보다 커진 경우 즉 왼쪽 값이 남은경우
        for t_idx in range(l_idx,mid+1,1): #남은 왼쪽 인덱스 값들을 임시 배열에 추가
            tmp[c_idx] = li[t_idx]
            c_idx = c_idx + 1
    for i in range(0,len(tmp),1): # tmp(임시 리스트) 에 있는 값들을 본 리스트에 추가
        if tmp[i] == None:
            break
        li[i] = tmp[i]
    print(li)

 

배열 나누기

def merge_sort(li,left,right):#배열을 쪼개는 메서드
    mid = 0
    if left == right: #원소가 1개면 종료
        return 0
    mid = int((left + right) / 2)
    merge_sort(li,left,mid) # left~mid 까지 분할
    merge_sort(li,mid+1,right) # mid+1 ~ right 까지 분할
    merges(li,left,mid,right)​

 

실행

list1 = [1,5,10,8,2,3,6,9,4,7]
tmp = tmp * len(list1)
merge_sort(list1,0,len(list1)-1)
print("실행결과")
print(tmp)

 

실행과정 및 결과

[1, 5, 10, 8, 2, 3, 6, 9, 4, 7]
[1, 5, 10, 8, 2, 3, 6, 9, 4, 7]
[1, 5, 10, 2, 8, 3, 6, 9, 4, 7]
[1, 2, 5, 8, 10, 3, 6, 9, 4, 7]
[1, 2, 5, 8, 10, 3, 6, 9, 4, 7]
[1, 2, 5, 8, 10, 3, 6, 9, 4, 7]
[1, 2, 5, 8, 10, 3, 6, 9, 4, 7]
[1, 2, 5, 8, 10, 3, 4, 6, 7, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
실행결과
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]