우선 정렬을 공부하기에 앞서 사용해야 하는 이유에 대해 알아보자
우리는 탐색을 위해서 정렬한다
컴퓨터는 보통 백만 개 이상의 많은 데이터를 다룬다 이때 만약 정렬이 되어있지 않다면 순차 탐색 알고리즘을 통해서 하나씩 데이터를 찾아야 한다
데이터가 정렬되어 있다면 이진 탐색을 통해서 더욱 쉽게 데이터를 찾을 수 있다 정렬되었다는 것은 모든 임의의 데이터의 왼쪽에는 자신의 값보다 작거나 같은 값이 있고, 오른쪽에는 자신의 값보다 크거나 같은 값이 있다는 것을 의미한다
따라서 임의로 하나의 데이터를 선택했을 때 원하는 값보다 선택한 값이 더 작다면 왼쪽은 아예 볼 필요가 없게 된다 시간 복잡도를 줄일 수 있어서 정렬은 꼭 필요하다
이미 정렬된 배열 부분에서 요소들을 하나씩 비교하여 자신의 위치를 찾아서 삽입함으로써 정렬하는 알고리즘이다
평균 시간 복잡도는 O(n^2)
[1단계] 선택 데이터를 현재 정렬된 데이터의 범위 내에서 적절한 위치를 찾는다
[2단계] 삽입할 위치와 선택 데이터의 위치 사이에 있는 데이터를 전부 오른쪽으로 shift한다
[3단계] 삽입할 위치에 데이터를 삽입한다
[4단계] 위의 단계를 반복한다

실제 예제를 통해 이해해보도록 하겠다
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N;
cin >> N; // 정렬할 데이터의 개수
vector<int> v(N, 0);
for (int i = 0;i < N;i++)
cin >> v[i];
for (int i = 1;i < N;i++) {
int index = i;
int value = v[i];
for (int j = i - 1;j >= 0;j--) { // index가 0인 값은 정렬된 것으로 간주하므로 1부터 정렬
if (v[j] < v[i]) { // 선택 데이터보다 더 작은 데이터를 찾으면
index = j + 1; // 해당 데이터의 오른쪽에 삽입하기 때문에 index값에 +1 해줘야한다
break;
}
if (j == 0) // 선택 데이터의 값이 가장 작은 경우
value = 0;
}
for (int j = i;j > index;j--)
v[j] = v[j - 1]; // 오른쪽으로 shift
v[index] = value;
}
for (int i = 0;i < N;i++)
cout << v[i] << " ";
return 0;
}
// 입력 예시
5
24 32 42 60 40
// 출력 예시
24 32 40 42 60