두번째 원소부터 시작해서 매번 삽입할 위치를 앞 원소들과 비교하며 결정하는 알고리즘
최선의 경우 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 |
댓글