'삽입'에 해당되는 글 1건

  1. 2016.12.08 [Algorithm] 삽입 정렬에 대하여!( Insertion Sort )
2016. 12. 8. 15:41

안녕하세요. 게임개발자 놀이터 입니다.


이번 포스팅에선 삽입 정렬에 대하여 정리 해보려합니다.



삽입 정렬 ( Insertion Sort )


삽입 정렬은 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여 자신의 위치를 찾아 삽입해서 정렬하는 알고리즘 입니다.

삽입 정렬의 경우 첫번째 요소를 이미 정렬됬다. 라고 간주 한 후 정렬을 시작합니다.

정렬되지않은 요소는 목록의 제일 뒤에있는 요소 부터 정렬된 목록과 비교하여 적절한 위치에 삽입합니다.

이 작업을 끝까지 반복하면 모든 요소가 정렬됩니다.


말로만 설명하면 좀 어려울수 있습니다.


정렬 과정


간단하게 삽입 정렬 예시를 보여드리겠습니다.


아래와 같이 5개의 숫자가 주어졌다고 했을때, 삽입 정렬로 정렬 해보겠습니다.


4 9 2 5 7


삽입정렬은 첫번째 요소는 정렬이 되었다고 판단하고, 두번째 부터 시작합니다.


첫번째

4 / □ 2 5 7  | key 값 = 9

9는 4보다 크니까 4보다 뒤쪽에 위치한다. □ 2 5 7 

4 / 9 2 5 7 


두번째

4 9 / □ 5 7 | key 값 = 2

2는 9보다 작으니까 9보다 앞 쪽에 위치한다. □ 9 5 7 

2는 4보다 작으니까 4보다 앞 쪽에 위치한다. □ 4 9 5 7

2 4 / 9 5 7


세번째

2 4 9 / □ 7 | key 값 = 5

5는 9보다 작으니까 9보다 앞쪽에 위치한다. 2 4  9 7

5는 4보다 크니까 4보다 뒤쪽에 위치한다. 2 4  9 7

2 4 5 / 9 7


네번째

2 4 5 9 / □ | key 값 = 7

7은 9보다 작으니까 9보다 앞쪽에 위치한다. 2 4 5 □ 9

7은 5보다 크니까 5보다 뒤쪽에 위치한다. 2 4 5 □ 9

2 4 5 7 9


정렬이 완료 되었습니다.


이처럼 첫번째 값을 제외하고 key 값으로 돌아가며 정렬이 완료된 부분과 비교하며 삽입을 하면 됩니다.

(사진 출처 : 나무위키 삽입정렬)



예제 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void InsertionSort(int arrays[], int length)
{
    int key = -1;
 
    for(int i=1; i<length; ++i)
    {
        key = arrays[i]; // 두번째 값부터.
        int j=i-1;
        for(; j>=0--j)
        {
            if(arrays[j] > key)
            {
                arrays[j+1= arrays[j];
            }
            else
            {
                break;
            }
        }
        arrays[j+1= key;
 
    }
}
cs


간단하게 구현했습니다.



알고리즘 분석


비교 횟수

삽입정렬은 두번째 요소부터 첫 요소와 비교하여 정렬한후 세번째 요소는 두번째와 첫번째와 비교합니다.

물론 이미 정렬되어있다면 비교를 하지 않겠지만, 빅오 표기법으로 생각하여 최악의 경우는 전부 비교하는겁니다.

0 + 1 + 2 + 3 .... + n-2 + n-1 = n(n-1)/2 가 되겠군요.


따라서 최악의 경우 시간 복잡도는 O(N²) 가 되겠습니다.


최선의 경우는 비교는 O(1)이고 for문이 Length-1 만큼 돌아야하니 O(n)이겠군요.





밑의 자료는 제가 삽입정렬에 대한 자료를 찾다가 발견한 자료들입니다.


삽입 정렬의 이미지 예시 

( 출처 : 위키 백과 : 삽입 정렬 )



삽입 정렬의 동영상 예시

출처 ( 유투브 동영상(클릭) )



감사합니다.

Posted by 시리시안