Insertion sort (삽입정렬)

Byungwoong An·2021년 2월 1일
0

1. 개념

삽입 정렬이란 말 그대로 2번째 원소부터 시작해서 정렬된 원소들 사이에서 올바른 자리를 찾아서 삽입하는 정렬이다. 즉 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열의 부분과 비교하여, 자신의 위치를 찾아가며 정렬을 완성시키는 알고리즘이다.
아래와 같은 배열이 있다고 가정하면

4 2 3 1 먼저 두번째 원소를 첫번째 원소와 비교하여 자신의 값을 찾는다. 두번째 원소인 2는 4보다 작으므로 4의 앞으로 2의 위치가 정해진다. 2 4 3 1 이후 3번째 원소를 앞의 정렬된 1,2 번째 원소들과 비교를 한다. 3번째 원소인 3은 2보다 크고 4보다 작으므로 그 사이에 위치하게 된다. 2 3 4 1 마지막으로 1은 가장 작은 원소이므로 맨 앞에 위치하게 된다. 1 2 3 4 다음과 같은 방법으로 배열을 정렬시키는 방법이 **Insertion sort**(삽입 정렬)이다.

이를 c코드로 하면 아래와 같다.

2. 코드

#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) 이다.

장점과 단점

장점

  • 안전한 정렬 방법
  • 만약 input data가 대부분 정렬되어 있는 경우, 매우 효율적일 수 있다.

단점

  • 많은 데이터들의 이동을 포함한다.
  • 데이터의 수가 많고 또 데이터의 크기가 클 경우에는 적합하지 않은 방법이다.
profile
No Pain No Gain

0개의 댓글