728x90
삽입 정렬(insertion sort)은?
- 두 번째 인덱스부터 시작함
- 해당 인덱스(key값) 앞에 있는 데이터(B)부터 비교해서 key 값이 더 작으면, B값을 뒤 인덱스로 복사함
- key 값이 더 큰 데이터를 만날때까지 반복, 큰 데이터를 만난 위치 바로 뒤에 key 값을 이동함
for index in range(10, 1, -1)
print(index)
"""
출력결과
10
9
8
7
6
5
4
3
2
"""
데이터가 4개 일 때 동작
data_list = [8, 4, 3, 5]
처음 한 번 실행하면, key값은 8, 인덱스(0) -1은 0보다 작음, 끝 : [8, 4, 3, 5]
두 번째 실행하면, key값은 4, 8보다 4가 작음 자리바꿈, 끝 : [4, 8, 3, 5]
세 번째 실행하면, key값은 3, 8보다 3이 작음 자리바꿈, 다시 4보다 2가 작음, 끝 : [3, 4, 8, 5]
네 번째 실행하면, key값은 5, 8보다 5가 작음 자리바꿈, 4보다는 5가 큼, 끝 : [3, 4, 5, 8]
알고리즘 구현
1. for stand in range(len(data_list)) 로 반복
2. key = data_list[stand]
3. for num in range(stand, 0, -1) 반복
- 내부 반복문 안에서 data_list[stand] < data_list[num - 1]이면,
data_list[num - 1], data_list[num] = data_list[num], data_list[num - 1]
def insertion_sort(data):
for index in range(len(data) - 1):
for index2 in range(index + 1, 0, -1):
if data[index2] < data[index2 - 1]:
data[index2], data[index2 - 1] = data[index2 - 1], data[index2]
else:
break
return data
#랜덤으로 출력
import random
data_list = random.sample(range(100), 50)
print(insertion_sort(data_list))
#출력결과
[1, 2, 3, 5, 8, 9, 10, 11, 14, 16, 17, 20, 22, 23, 32, 33, 34, 36, 40, 43, 46, 47,
49, 50, 51, 53, 56, 57, 60, 61, 62, 64, 65, 67, 68, 71, 72, 74, 75, 81, 82, 83, 85,
86, 89, 90, 91, 93, 96, 99]
알고리즘 분석
- 반복문이 두 개 O(n²)
- 최악의 경우 n*(n-1) / 2
- 완전 정렬이 되어 있는 상태면 최선은 O(n)
'IT개발 > 알고리즘, 우리 친해지자!' 카테고리의 다른 글
알고리즘 : 퀵 정렬(Quick sort) (0) | 2021.08.30 |
---|---|
알고리즘 : 동적계획법(Dynamic Programming)과 분할정복(Divide and Conquer) (0) | 2021.08.28 |
알고리즘 : 재귀 용법(recursive call) (0) | 2021.08.26 |
알고리즘 : 선택정렬(selection sort) (0) | 2021.08.24 |
알고리즘 : 버블 정렬(Bubble sort) (0) | 2021.08.19 |