삽입 정렬이란 말 그대로 2번째 원소부터 시작해서 정렬된 원소들 사이에서 올바른 자리를 찾아서 삽입하는 정렬이다. 즉 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열의 부분과 비교하여, 자신의 위치를 찾아가며 정렬을 완성시키는 알고리즘이다.
아래와 같은 배열이 있다고 가정하면
이를 c코드로 하면 아래와 같다.
#include <iostream>
using namespace std;
int main()
{
int a[100], n, tmp, i, j;
scanf("%d",&a);
for(i=0; i<n; i++) scanf("%d",&a[i]);
// 여기서 두번째 원소부터 차례대로 비교해본다
for(i=1; i<n; i++){
tmp = a[i];
// 이후 우리가 삽입할 원소 이전부터 차례대로 값을 비교하며 삽입해야할 위치를 찾는다.
for(j=i-1; j>=0; j--){
//삽입하기 위해 위치를 찾으며 배열을 이동시킴
if(a[j]>tmp) a[j+1]=a[j];
else break;
}
//위치를 찾았을 경우 값을 넣어주기
a[j+1] = tmp;
}
for(i=0; i<n; i++){
printf("%d ",a[i]);
}
return 0;
}
최선의 경우 즉 처음부터 모든 값이 정렬되어 있는 상태이면 아무런 이동없이 자신의 자리를 체크하기 위한 한번의 비교만 있으면 된다.
따라서 최선의 경우의 시간복잡도는 O(n) 이지만, 최악의 경우 즉 배열이 역순으로 정렬되어 있을 경우에는 모든 비교를 하고, 모든 이동이 있어야하므로 이때의 시간복잡도는 O(n^2) 이다.
장점
단점