본문 바로가기
CS/Algorithm

삽입 정렬 (Insertion Sort)

by seoyamin 2022. 5. 6.

1. 삽입 정렬

각 숫자를 적절한 위치에 삽입하자 !

 

※ 한번 수행할 때마다 [앞] 정렬된 부분의 원소 수가 1개 증가, [뒤] 정렬 안된 부분의 원소 수는 1개 감소됨

    반복해서 수행하면 결국 [뒤] 정렬 안된 부분에는 아무 원소도 남지 않고 모두 정렬됨

 

 

※ 선택/버블 vs. 삽입

▶ 선택, 버블: 이미 알맞게 정렬되어 있더라도 차례가 되면 정렬당함 (위치 바꾸는 과정 거침) : 비효율적

삽입: 필요할때만 위치를 바꿈 : 효율적

      이번 주자 앞에 있는 애들은 다 이미 알맞은 위치에 정렬되어 있는 상태이므로 다시 정렬할 필요 없음

 

 

 

 

2. 삽입 정렬 예제

ex )  1  10  5  8  7  6  4  3  2  9  오름차순 정리하시오.

 

#include <stdio.h>

int main(void) {
	int a[] = { 1, 10, 5, 8, 7, 6, 4, 3, 2, 9 };
	int n = sizeof(a) / sizeof(int);
	int temp;

	for (int i = 1; i < n; i++) {   // i는 이번 주자
		int j = i;
        
        // 이번 주자 바로 앞의 원소부터 하나씩 비교하며 하극상인 애 있으면 자리 바꾸기
		while (a[j-1] > a[j]) {     
			temp = a[j-1];
			a[j-1] = a[j];
			a[j] = temp;
			j--;
		}
	}

	for (int i = 0; i < n; i++) {
		printf("%d ", a[i]);
	}

	return 0;
}

 

 

 

3. 삽입 정렬의 시간 복잡도

앞의 예제에서 최악의 경우 총 비교 횟수를 대략적으로 살펴보면 다음과 같다. 

10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 +1 = 10 * (10 +1) / 2

 

∴  input이 N개일 때, 삽입 정렬의 시간복잡도는 O(N^2) 

 

선택정렬, 버블정렬, 삽입정렬 모두 시간 복잡도가 동일하지만, 실제로는 삽입정렬이 가장 연산횟수 적다!

(∵ 거의 정렬이 되어있는 배열의 경우, 삽입정렬이 절대적으로 유리함)

 
 

'CS > Algorithm' 카테고리의 다른 글

쉘 정렬 (Shell Sort)  (0) 2022.06.06
퀵 정렬 (Quick Sort)  (0) 2022.05.09
버블 정렬 (Bubble Sort)  (0) 2022.05.04
선택 정렬 (Selection Sort)  (0) 2022.05.03
정렬 알고리즘  (0) 2022.05.03