삽입 정렬(Insertion Sort)
은 선택 정렬(Selection Sort)
와 유사하지만, 조금 더 효율적인 알고리즘이다.
삽입 정렬은 최선의 경우에는 O(N)
이라는 속도를 가지고 있다.
데이터: [4, 6, 2, 7, 8, 5, 0, 1]
처음에는 2번째 원소부터 시작한다.
[2, 4, 6, 7, 8, 5, 0, 1]
[2, 4, 5, 6, 7, 8, 0, 1]
[0, 2, 4, 5, 6, 7, 8, 1]
[0, 1, 2, 4, 5, 6, 7, 8]
datas = [4, 6, 2, 7, 8, 5, 0, 1]
flag = False
c = 1
for i in range(1, len(datas)):
prev = i - 1
for j in range(i, 0, -1):
if (datas[j] > datas[prev]) or (prev < 0):
break
else:
print(f"{datas[j]}가 {datas[prev]} 보다 작음 데이터 교환")
print(datas, '=>', end=' ')
datas[j], datas[prev] = datas[prev], datas[j]
print(datas)
flag = True
prev -= 1
if flag:
print(f"\n{c}회전: {datas}")
flag = False
c += 1
datas = [4, 6, 2, 7, 8, 5, 0, 1]
flag = False
c = 1
for i in range(1, len(datas)):
# j = 현재 위치
# prev = 이전 위치
prev = i - 1
# 현재 위치부터 0번째까지
for j in range(i, 0, -1):
# 현재 위치의 데이터가 이전 위치의 데이터보다 크면 교환하지 않음
# 이전 위치인 prev가 1보다 작으면(데이터 벗어남) 데이터 교환(첫 번째라는 의미)
if (datas[j] > datas[prev]) or (prev < 0):
break
else:
print(f"{datas[j]}가 {datas[prev]} 보다 작음 데이터 교환")
print(datas, '=>', end=' ')
# 만약 현재 데이터가 이전 데이터보다 작으면 데이터 교환
datas[j], datas[prev] = datas[prev], datas[j]
print(datas)
flag = True
# 다음 데이터 비교를 위해 prev - 1
prev -= 1
if flag:
print(f"\n{c}회전: {datas}")
flag = False
c += 1
2가 6 보다 작음 데이터 교환
[4, 6, 2, 7, 8, 5, 0, 1] => [4, 2, 6, 7, 8, 5, 0, 1]
2가 4 보다 작음 데이터 교환
[4, 2, 6, 7, 8, 5, 0, 1] => [2, 4, 6, 7, 8, 5, 0, 1]
1회전: [2, 4, 6, 7, 8, 5, 0, 1]
5가 8 보다 작음 데이터 교환
[2, 4, 6, 7, 8, 5, 0, 1] => [2, 4, 6, 7, 5, 8, 0, 1]
5가 7 보다 작음 데이터 교환
[2, 4, 6, 7, 5, 8, 0, 1] => [2, 4, 6, 5, 7, 8, 0, 1]
5가 6 보다 작음 데이터 교환
[2, 4, 6, 5, 7, 8, 0, 1] => [2, 4, 5, 6, 7, 8, 0, 1]
2회전: [2, 4, 5, 6, 7, 8, 0, 1]
0가 8 보다 작음 데이터 교환
[2, 4, 5, 6, 7, 8, 0, 1] => [2, 4, 5, 6, 7, 0, 8, 1]
0가 7 보다 작음 데이터 교환
[2, 4, 5, 6, 7, 0, 8, 1] => [2, 4, 5, 6, 0, 7, 8, 1]
0가 6 보다 작음 데이터 교환
[2, 4, 5, 6, 0, 7, 8, 1] => [2, 4, 5, 0, 6, 7, 8, 1]
0가 5 보다 작음 데이터 교환
[2, 4, 5, 0, 6, 7, 8, 1] => [2, 4, 0, 5, 6, 7, 8, 1]
0가 4 보다 작음 데이터 교환
[2, 4, 0, 5, 6, 7, 8, 1] => [2, 0, 4, 5, 6, 7, 8, 1]
0가 2 보다 작음 데이터 교환
[2, 0, 4, 5, 6, 7, 8, 1] => [0, 2, 4, 5, 6, 7, 8, 1]
3회전: [0, 2, 4, 5, 6, 7, 8, 1]
1가 8 보다 작음 데이터 교환
[0, 2, 4, 5, 6, 7, 8, 1] => [0, 2, 4, 5, 6, 7, 1, 8]
1가 7 보다 작음 데이터 교환
[0, 2, 4, 5, 6, 7, 1, 8] => [0, 2, 4, 5, 6, 1, 7, 8]
1가 6 보다 작음 데이터 교환
[0, 2, 4, 5, 6, 1, 7, 8] => [0, 2, 4, 5, 1, 6, 7, 8]
1가 5 보다 작음 데이터 교환
[0, 2, 4, 5, 1, 6, 7, 8] => [0, 2, 4, 1, 5, 6, 7, 8]
1가 4 보다 작음 데이터 교환
[0, 2, 4, 1, 5, 6, 7, 8] => [0, 2, 1, 4, 5, 6, 7, 8]
1가 2 보다 작음 데이터 교환
[0, 2, 1, 4, 5, 6, 7, 8] => [0, 1, 2, 4, 5, 6, 7, 8]
4회전: [0, 1, 2, 4, 5, 6, 7, 8]
최선의 경우에는 교환하지 않고 한 번씩만 비교하고 그냥 넘어가기 때문에 O(N)
의 시간 복잡도를 가진다.
하지만 최악의 경우에는 모든 숫자가 역순으로 되어있어 모두 교환하는 작업이 이루어 질 때 O(N^2)
의 시간이 걸린다.
주어진 배열 안에서 교환하기 때문에 O(N)
이다.