선택한 요소를 그보다 더 앞쪽의 알맞은 위치에 삽입하는 작업을 반복하여 정렬하는 알고리즘

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년.