본문 바로가기
Computer Science/Algorithm

#03 삽입 정렬(Insertion Sort)

by 데이터현 2022. 1. 5.

두번째 원소부터 시작해서 매번 삽입할 위치를 앞 원소들과 비교하며 결정하는 알고리즘

최선의 경우 O(N) 이라는 엄청나게 효율적인 알고리즘

 

최악의 경우(역으로 정렬되어 있을 경우) Selection Sort와 마찬가지로, O(n^2) 이다.

 

하지만, 모두 정렬이 되어있는 경우(Optimal)한 경우, 한번씩 밖에 비교를 안하므로 O(n) 의 시간복잡도를 가지게 된다. 또한, 이미 정렬되어 있는 배열에 자료를 하나씩 삽입/제거하는 경우에는, 현실적으로 최고의 정렬 알고리즘이 되는데, 탐색을 제외한 오버헤드가 매우 적기 때문이다.

 

최선의 경우는 O(n) 의 시간복잡도를 갖고, 평균과 최악의 경우 O(n^2) 의 시간복잡도를 갖게 된다.

def insertionsort(arr):
    for i in range(1,len(arr)):
        for j in range(i,0,-1):
            if arr[j] < arr[j-1]:
                arr[j], arr[j-1] = arr[j-1], arr[j]
            else:
                break
    return arr
    
def improved_insertionsort(arr):
    for end in range(1, len(arr)):
        to_insert = arr[end]
        i = end
        while i > 0 and arr[i - 1] > to_insert:
            arr[i] = arr[i - 1]
            i -= 1
        arr[i] = to_insert
    return arr

공간복잡도

주어진 배열 안에서 교환(swap)을 통해, 정렬이 수행되므로 O(n) 이다.

 

'Computer Science > Algorithm' 카테고리의 다른 글

#05 병합 정렬(Merge Sort)  (0) 2022.01.06
#04 퀵 정렬(Quick Sort)  (0) 2022.01.06
#02 - 선택 정렬(Selection Sort)  (0) 2022.01.05
#01 거품정렬 (bubble sort)  (0) 2022.01.05
제곱수, 2의 n 제곱인지 확인  (0) 2021.12.29

댓글