[알고리즘] 삽입 정렬
(문제) 삽입 정렬
[8, 10, 1, 3, 2, 7, 6, 4] 를 오른차 순으로 삽입 정렬하시오.
입력설명
입력으로 들어온 리스트를 정렬하시오
출력설명
오름차 순으로 삽입 정렬을 하시오
테스트케이스
입력예제 | 출력예제 |
---|---|
[8, 10, 1, 3, 2, 7, 6, 4] | [1, 2, 3, 4, 6, 7, 8, 10] |
해결방법
1. 준비
리스트의 인덱스 1부터 시작하여 끝 인덱스까지 아래 작업을 반복을 할 것이다.
리스트 0번째 인덱스는 정렬 되어 있다고 가정을하고 시작을 하여 1번째 인덱스 부터 반복을 시작하는 것이다.
2. 정렬 시작
각 반복으로 들어오는 인덱스는 정렬을 하려고 하는 값 key이다.
이 key를 정렬 시키기 위해서는 key 요소의 인덱스 바로 전에 있는 인덱스를 저장하는 변수 b_idx에 값을 넣는다.
(key값의 인덱스-1(전에 인덱스))
for i in range(1, len(arr)):
b_idx = i - 1
key = arr[i]
b_idx 번째 인덱스 요소의 값과 key 값의 크기를 비교하여 만약에 b_idx 번째 인덱스 요소의 값보다 작고 b_idx 가 0보다 작지 않을 경우
b_idx + 1 인덱스 요소에 b_idx 값을 복사한다.
그 후, 전의 b_idx - 1을 하여 그 뒤에 있는 인덱스 또한 존재한다면 즉 b_idx가 0 보다 작지 않으면 반복한다.
for i in range(1, len(arr)):
b_idx = i - 1
key = arr[i]
while arr[b_idx] > key and b_idx >= 0: # <---- 여기
arr[b_idx + 1] = arr[b_idx]
b_idx = b_idx - 1
만약 b_idx 번째 인덱스 요소의 값보다 key 값이 더 클 경우 key 값은 b_idx + 1 인덱스 요소에 대입한다.
for i in range(1, len(arr)):
b_idx = i - 1
key = arr[i]
while arr[b_idx] > key and b_idx >= 0:
arr[b_idx + 1] = arr[b_idx]
b_idx = b_idx - 1
arr[b_idx + 1] = key < --- 여기
이 작업을 for 문이 끝날 때 까지 반복 한다.
동작 시각화
인덱스 1 작업
인덱스 2 작업
인덱스 3 작업
코드
arr = [100, 10, 50, 60, 70, 15, 1, 5, 3, 11, 10, 8, 7]
for i in range(1, len(arr)):
b_idx = i - 1
key = arr[i]
while arr[b_idx] > key and b_idx >= 0:
arr[b_idx + 1] = arr[b_idx]
b_idx = b_idx - 1
arr[b_idx + 1] = key
print(arr)
댓글남기기