티스토리 뷰
목표
- Insertion Sort에 대해 설명할 수 있다.
- Insertion Sort 과정에 대해 설명할 수 있다.
- Insertion Sort를 Kotlin으로 구현할 수 있다.
- Insertion Sort의 특징을 이해하여 시간 복잡도와 공간 복잡도를 계산할 수 있다.
요약
Insertion Sort는 Selection Sort와 비슷하여 헷갈릴 수 있지만 좀 더 효율적인 정렬 알고리즘이다.
Insertion Sort는 2번째 요소부터 시작하여 그 앞의 요소들과 대소 비교하여 삽입할 위치를 지정한 후 삽입할 위치 이후의 요소들을 한 칸씩 뒤로 미루면서 삽입하는 정렬 알고리즘이다.
최선의 경우에는 O(N) 이라는 빠른 효율성을 가지고 있어 다른 정렬 알고리즘의 일부로 사용될 만큼 좋은 정렬 알고리즘이다.
과정 (오름차순)
- 두 번째 요소를 그 앞의 요소(첫 번째 요소)들과 비교하여 삽입할 위치를 찾아 해당 위치에 넣는다.
- 세 번째 요소를 그 앞의 요소(두 번째, 첫 번째 요소)들과 비교하여 삽입할 위치를 찾아 해당 위치에 넣는다.
- N 번째 요소까지 반복한다.
Kotlin 코드
fun insertionSort() {
val lst = mutableListOf(1, 34, 5, 6, 78, 23, 56, 31, 64)
for (i in 1 until lst.count()) {
val temp = lst[i]
for (j in i - 1 downTo 0) {
if (lst[j] < lst[i]) {
lst[j + 1] = temp
break
} else {
lst[j + 1] = lst[j]
}
}
}
println(lst)
}
시간 복잡도
- 최악의 경우(역으로 정렬 된 경우)
- 비교 횟수 : 외부 루프 안의 각 반복마다 i번의 비교 수행
(n-1) + (n-2) + ... + 2 + 1 = n(n-1)/2
= O(n^2)
- 최선의 경우
- 비교 횟수 : 이동 없이 1번의 비교만 이루어진다.
(n-1)번
= O(n)
공간 복잡도
기존에 주어진 배열에서 원소 Swap만 이루어지므로 공간 복잡도는 O(n)이다.
특징
장점
- 알고리즘 구현이 비교적 단순하다.
- 대부분의 원소가 이미 정렬되어 있는 경우에 효율적이다.
- 주어진 배열에서만 교환하므로 다른 메모리 공간이 필요하지 않다. => 제자리 정렬(in-place sorting)
- 안정 정렬이다.
- 다른 O(n^2) 알고리즘에 비해 상대적으로 빠르다.
자체 테스트(단위 : 나노초)
버블 정렬 시간 : 11658800
선택 정렬 시간 : 57300
삽입 정렬 시간 : 33000
단점
- 시간 복잡도가 평균, 최악에서는 O(n^2)로 굉장히 비효율적이다.
Reference
반응형
'Programming > 알고리즘' 카테고리의 다른 글
힙 정렬 (Heap Sort) (0) | 2021.06.07 |
---|---|
합병 정렬 (Merge Sort) (0) | 2021.06.07 |
퀵 정렬 (Quick Sort) (0) | 2021.06.01 |
선택 정렬 (Selection Sort) (0) | 2021.05.30 |
거품 정렬 (Bubble Sort) (0) | 2021.05.30 |
댓글