삽입 정렬
자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘
k번째 반복 후의 결과 배열은, 앞쪽 k+1 항목이 정렬된 상태
설명
5개의 숫자가 들어있는 리스트가 있다.
두번째의 값을 key로 갖는다.
해당 그림에서는 8이 key가 된다.
key값을 기준으로 그 앞의 값들과 비교한다. 즉, 왼쪽의 값들과 비교하며 자신의 자리를 찾는다.
key인 8의 값을 그 앞에 위치한 6의 값과 비교한다.
8이 6보다 크기 때문에 자리를 바꾸지 않는다.
그 다음 key의 값은 세번째인 3이 된다.
3보다 앞에 위치한 8과 먼저 비교한다. 3이 더 작으므로 위치를 바꿔준다.
그 다음 key인 3보다 앞에 위치한 6과 비교한다. 3이 더 작으므로 위치를 바꿔준다.
다음 key의 값은 네번째에 위치한 9가 된다.
이 또한 마찬가지로 차례대로 앞의 값과 비교를 하며 정렬해준다.
앞에 값들이 9보다 모두 작으므로 자리 변동이 없다.
마지막 다섯번째에 위치한 4가 다음 key 값이 된다.
마찬가지로 차례대로 앞의 값들과 비교하여 정렬한다.
이 모든 과정을 마치고 나면 오름차순으로 정렬된 리스트를 확인할 수 있다.
python 구현
lst = [6, 8, 3, 9, 4, 2]
print(lst)
for i in range(1, len(lst)):
for j in range(i, 0, -1):
if lst[i] < lst[j-1]:
tmp = lst[j-1]
lst[j-1] = lst[i]
lst[i] = tmp
i -= 1
print(lst)
내가 맨 처음에 작성한 코드이다.
출력에는 문제가 없다.
하지만 좀 더 코드를 다듬어 줄 수 있었다.
(인프런 강의 참조하여 수정)
lst = [6, 8, 3, 9, 4, 2]
print(lst)
for i in range(1, len(lst)):
while i > 0 and lst[i-1] > lst[i]:
lst[i-1], lst[i] = lst[i], lst[i-1]
i -= 1
print(lst)
위키백과에 나와있는 코드
def insert_sort(x):
for i in range(1, len(x)):
j = i - 1
key = x[i]
while x[j] > key and j >= 0:
x[j+1] = x[j]
j = j - 1
x[j+1] = key
return x
시간복잡도
최선의 경우: O(n)
최악의 경우: O(n^2)
출처
https://ko.wikipedia.org/wiki/%EC%82%BD%EC%9E%85_%EC%A0%95%EB%A0%AC
https://gmlwjd9405.github.io/2018/05/06/algorithm-insertion-sort.html
'Study > Python' 카테고리의 다른 글
[python][CodeUp]Python 기초 100제 - 64번 (0) | 2022.04.23 |
---|---|
[python][CodeUp]Python 기초 100제 - 58번 (0) | 2022.04.23 |
[python]else (0) | 2021.02.13 |
[python]enumerate, zip (0) | 2021.02.12 |
[python]리스트 컴프리헨션(list comprehension) (0) | 2021.02.12 |