삽입 정렬(Insert Sort)![](http://blogimgs.naver.com/nblog/mylog/post/emoticon/3_09.gif)
- 기초적인 정렬 알고리즘(선택 정렬, 버블 정렬, 삽입 정렬)중 하나.
- 수행 방법
- 정렬 되어있는 부분집합에 정렬할 새로운 원소의 위치를 찾아 삽입하는 방법
- 정렬할 자료를 두 개의 부분집합 S와 U로 가정
- 부분집합 S : 정렬된 앞부분의 원소들
- 부분집합 U : 아직 정렬되지 않은 나머지 원소들
- 정렬되지 않은 부분집합 U의 원소를 하나씩 거내서 이미 정렬되어있는 부분집합 S의 마지막 원소부터 비교하면서 위치를 찾아 삽입
- 삽입 정렬을 반복하면서 부분집합 S의 원소는 하나씩 늘리고 부분집합 U의 원소는 하나씩 감소하게 한다. 부분 집합 U가 공집합이 되면 삽입 정렬이 완성된다.
- 삽입 정렬 수행 과정
- 정렬 되지 않은 [ 69, 10, 30, 2, 16, 8, 31, 22 ]의 자료들을 삽입 정렬 방법으로 정렬하는 과정을 살펴보자.
- 초기 상태 : 첫 번째 원소는 정렬되어있는 부분 집합 S로 생각하고 나머지 원소들은 정렬되지 않은 원소들의 부분 집합 U로 생각한다.
S=[69], U=[10, 30, 2, 16, 8, 31, 22]
![](http://postfiles10.naver.net/20090709_105/redwave102_1247071618680TQw7N_jpg/%EC%82%BD%EC%9E%85%EC%A0%95%EB%A0%AC1_redwave102.jpg?type=w2)
1. U의 첫 번째 원소 10을 S의 마지막 원소 69와 비교하여 (10 < 69)이므로 원소 10은 원소 69의 앞자리가 된다. 더 이상 비교할
S의 원소가 없으므로 찾은 위치에 원소 10을 삽입한다.
S = [10, 69], U = [30, 2, 16, 8, 31, 22]
![](http://postfiles6.naver.net/20090709_197/redwave102_1247071618923AhCkS_jpg/%EC%82%BD%EC%9E%85%EC%A0%95%EB%A0%AC2_redwave102.jpg?type=w2)
2. U의 첫 번째 원소 30을 S의 마지막 원소 69와 비교하여 (30 < 69)이므로 원소 69의 앞자리 원소 10과 비교한다. (30 > 10)이므로
원소 10과 69 사이에 삽입한다.
S = [10, 30, 69], U = [2, 16, 8, 31, 22]
![](http://postfiles6.naver.net/20090709_165/redwave102_1247071619336JViAO_jpg/%EC%82%BD%EC%9E%85%EC%A0%95%EB%A0%AC3_redwave102.jpg?type=w2)
3. U의 첫 번째 원소 2을 S의 마지막 원소 69와 비교하여 (2 < 69)이므로 원소 69의 앞자리 원소 30과 비교하고, (2 < 30)이므로
다시 그 앞자리 원소 10과 비교하는데, (2 < 10)이면서 더 이상 비교할 S의 원소가 없으므로 원소 10의 앞에 삽입한다.
S = [2, 10, 30, 69], U = [16, 8, 31, 22]
![](http://postfiles13.naver.net/20090709_124/redwave102_1247071619582DED9h_jpg/%EC%82%BD%EC%9E%85%EC%A0%95%EB%A0%AC4_redwave102.jpg?type=w2)
4. U의 첫 번째 원소 16을 S의 마지막 원소 69와 비교하여 (16 < 69)이므로 그 앞자리 원소 30과 비교한다. (16 < 30)이므로
다시 그 앞자리 원소 10과 비교하여, (16 > 10)이므로 원소 10과 30 사이에 삽입한다.
S = [2, 10, 16, 30, 69], U = [8, 31, 22]
![](http://postfiles2.naver.net/20090709_225/redwave102_12470716198954KSWv_jpg/%EC%82%BD%EC%9E%85%EC%A0%95%EB%A0%AC5_redwave102.jpg?type=w2)
5. U의 첫 번째 원소 8을 S의 마지막 원소 69와 비교하여 (8 < 69)이므로 그 앞자리 원소 30과 비교한다. (8 < 30)이므로 그 앞자리
원소 10과 비교하여, (8 < 10)이므로 다시 그 앞자리 원소 2와 비교하는데, (8 > 2)이므로 원소 2와 10사이에 삽입한다.
S = [2, 8, 10, 16, 30, 69], U = [31, 22]
![](http://postfiles1.naver.net/20090709_80/redwave102_1247071620163AKpLN_jpg/%EC%82%BD%EC%9E%85%EC%A0%95%EB%A0%AC6_redwave102.jpg?type=w2)
6. U의 첫 번째 원소 31을 S의 마지막 원소 69와 비교하여 (31 < 69)이므로 그 앞자리 원소 30과 비교한다. (31 > 30)이므로 원소30과
69 사이에 삽입한다.
S = [2, 8, 10, 16, 30, 31, 69], U = [22]
![](http://postfiles2.naver.net/20090709_81/redwave102_1247071620508zQfHp_jpg/%EC%82%BD%EC%9E%85%EC%A0%95%EB%A0%AC7_redwave102.jpg?type=w2)
7. U의 첫 번째 원소 22를 S의 마지막 원소 69와 비교하여 (22 < 69)이므로 그 앞자리 원소 31과 비교한다. (22 < 31)이므로 그앞자리
원소 30과 비교한다. (22 < 30)이므로 다시 그 앞자리 원소 16과 비교하여, (22 > 16)이므로 원소 16과 30사이에 삽입한다.
S = [2, 8, 10, 16, 22, 30, 31, 69], U = []
![](http://postfiles15.naver.net/20090709_222/redwave102_12470716208092G5ah_jpg/%EC%82%BD%EC%9E%85%EC%A0%95%EB%A0%AC8_redwave102.jpg?type=w2)
![](http://postfiles13.naver.net/20090709_28/redwave102_12470716211102PQ4o_jpg/%EC%82%BD%EC%9E%85%EC%A0%95%EB%A0%AC_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98_redwave102.jpg?type=w2)
- 삽입 정렬 알고리즘의 분석
- 메모리 사용공간
- 연산 시간
- 최선의 경우 : 원소들이 이미 정렬되어 있어서 비교횟수가 최소인 경우
- 이미 정렬되어있는 경우에는 바로 앞자리 원소와 한번만 비교한다.
- 전체 비교횟수 = n-1
- 시간 복잡도 : O(n)
- 최악의 경우 : 모든 원소가 역순으로 되어있어서 비굣횟수가 최대인 경우
- 전체 비교횟수 = 1+2+3+...+(n-1) = n(n-1)/2
- 시간 복잡도 : O(n²)
- 삽입 정렬의 평균 비교횟수 = n(n-1)/4
- 평균 시간 복잡도 : O(n²)