선택한 요소를 그보다 더 앞쪽의 알맞은 위치에 삽입하는 작업을 반복하여 정렬하는 알고리즘
void insertionSort(int[] arr, int n) {
for(int i=1; i<n; i++) { // 1.
int j;
int temp = arr[i];
for(int j=i; j>0 && arr[j-1] > temp; j--) { // 2.
arr[j] = arr[j-1];
}
arr[j] = temp; // 3.
}
}
arr[0]
)는 정렬이 된 상태로 가정하므로 두 번째 요소부터 정렬을 시작한다. 변수 temp
에 현재 선택한 값(arr[i]
)을 저장해놓는다.j--
). 왼쪽 요소의 index 값은 선택값의 인덱스 - 1
이므로, 왼쪽 요소의 인덱스 값이 음수가 나오지 않도록 j>0
이라는 조건을 걸어준다. 왼쪽 요소의 값(arr[j-1]
)이 선택값(temp
)보다 크다면 왼쪽 요소를 오른쪽으로 한 자리 이동시켜준다. 계속 왼쪽으로 이동하며 이 과정을 반복하다가, 선택값보다 작은 값이 등장하면 반복문을 종료한다.arr[j]
)에 저장해놓았던 선택값(temp
)을 삽입한다.for(int i=1; i<n; i++) {
int j;
int temp = arr[i];
for(int j=i; j>0 && arr[j-1] > temp; j--) {
arr[j] = arr[j-1];
}
arr[j] = temp;
}
바깥 루프 i | 안쪽 루프 j에서의 비교 횟수 |
---|---|
i=0 | n-1 |
i=1 | n-2 |
i=2 | n-3 |
... | ... |
i=(n-2) | 1 |
총 비교 횟수 = 안쪽 루프 j에서의 비교 횟수의 합
(n-1) + (n-2) + (n-3) + ... + 1 = n(n-1)/2
∴ 시간복잡도 O(n^2)
역순으로 정렬된 경우(최악) → O(n^2)
50
40
30
20
10
40
50
30
20
10
=> 1
30
40
50
20
10
=> 2
20
30
40
50
10
=> 3
10
20
30
40
50
=> 4
원하는 순서대로 이미 정렬되어 있는 경우(최선) => O(n)
10
20
30
40
50
10
20
30
40
50
=> 1
10
20
30
40
50
=> 1
10
20
30
40
50
=> 1
10
20
30
40
50
=> 1
📖 참고
- Bohyoh Shibata. (2020). Do it! 자료구조와 함께 배우는 알고리즘 입문 - 자바편(강민 옮김). 이지스퍼블리싱
- 이관용. "알고리즘 10강. 정렬 알고리즘 (1)" 방송통신대학교, 2022년.