삽입 정렬(Insertion Sort)이란?
이름 그대로,
원소가 들어갈 적당한 자리를 찾아, 삽입하여 정렬하는 방식이다.
예)

1) 배열의 두 번째 값부터 시작한다.
arr[1]은 key값으로 따로 저장해놓는다.

2) key값과, 이전 값인 arr[0]값을 비교한다.

3) 이전 값(arr[0])이 key값보다 크므로, 값을 뒤로 한칸 이동시킨다.
(arr[0]에 실제로 값이 없어지는 것은 아니지만, 이해를 위해 지웠습니다.)

4) 더 이상 이전으로 이동할 수 없으므로, 비교를 끝내고 저장해놨던 key값을 arr[0]에 설정한다.

5) 다음 값을 key값으로 설정한다.

6) key값과, 이전 값을 비교한다.
key값이 더 크므로, 다음으로 넘어간다.

7) 다음 값을 key값으로 설정한다.

8) key값과, 이전 값을 비교한다.
key값이 더 크므로, 다음으로 넘어간다.

9) 다음 값을 key값으로 설정한다.

10) key값과, 이전 값을 비교한다.

11) arr[3]값이 key값보다 크므로, 값을 한칸 뒤로 이동시킨다.

12) 하나 더 이전 값인 arr[2]와 key값을 비교한다.

13) arr[2]값이 key값보다 크므로, 값을 한칸 뒤로 이동시킨다.

14) 하나 더 이전 값인 arr[1]과 key값을 비교한다.

15) arr[1]값이 key값보다 크므로, 값을 한칸 뒤로 이동시킨다.

16) 하나 더 이전 값인 arr[0]과 key값을 비교한다.

17) arr[0]값보다 key값이 더 크므로, 비교를 끝내고 arr[1]에 저장해놨던 key값을 설정한다.

18) arr[4]까지 모두 돌았으므로, 정렬 작업을 끝낸다.
소스코드
#include <iostream>
using namespace std;
void insertionSort(int* arr, int len);
int main() {
int N;
cin >> N;
int* arr = new int[N];
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
insertionSort(arr, N);
for (int i = 0; i < N; i++) {
cout << arr[i] << endl;
}
delete[] arr;
return 0;
}
void insertionSort(int* arr, int len) {
for (int i = 1; i < len; i++) {
int key = arr[i];
int prev = i - 1;
while (prev >= 0) {
if (key < arr[prev]) {
arr[prev + 1] = arr[prev];
prev--;
}
else {
break;
}
}
if (prev + 1 != i) arr[prev + 1] = key;
}
}
시간복잡도
평균의 경우 : O(n2)
최선의 경우 : O(n)
배열에 값이 이미 정렬되어 있는 경우, 하나 앞의 값하고만 비교하면 된다.
최악의 경우 : O(n2)
배열에 값이 역순으로 정렬되어 있는 경우, 데이터 총 개수가 n이라고 하면, 비교 횟수는 아래와 같다.
1 + 2 + ... + (n-2) + (n-1)
= n(n-1) / 2
= O(n2)
'Algorithm > 개념' 카테고리의 다른 글
| [Algorithm] 정렬 - 선택 정렬 (Selection Sort) (0) | 2019.05.23 |
|---|---|
| [Algorithm] 정렬 - 거품 정렬 (Bubble Sort) (0) | 2019.05.23 |
| [Algorithm] 유클리드 호제법 (0) | 2019.05.22 |
| [Algorithm] Breadth-first search (너비 우선 탐색) (0) | 2018.05.07 |
| [Algorithm] Floyd-Warshall Algorithm (플로이드-워셜 알고리즘) (0) | 2018.05.05 |