선택 정렬(Selection sort)이란
주어진 데이터 중 최소값을 찾아서 맨 앞에 있는 값과 위치를 바꾼다. 맨 앞 값과 바꿔준 최소값을 제외한 나머지 데이터에서 최소값을 찾아 그 다음 앞(두 번째 턴이라면 1번 인덱스 값)에 있는 값과 위치를 바꾼다. 바꿀 요소가 없을 때까지 반복한다.
선택 정렬 예시
요소가 4개일 때
nums = [2, 4, 1, 3]
- 0번 인덱스를 기준으로 1~3번 인덱스와 값 비교
- 2, 4 비교
- 2, 1 비교
- 1, 3 비교
- 1이 최소값이므로 2와 자리 바꿈
[1, 4, 2, 3]
- 1턴 완료 - 1번 인덱스를 기준으로 2~3번 인덱스와 값 비교
- 4, 2 비교
- 2, 3 비교
- 2가 최소값이므로 4와 자리 바꿈
[1, 2, 4, 3]
- 2턴 완료 - 2번 인덱스를 기준으로 3번 인덱스와 값 비교
- 4, 3 비교
- 3이 최소값이므로 4와 자리 바꿈
[1, 2, 3, 4]
- 3턴 완료
요소가 5개일 때
nums = [7, 3, 2, 4, 1]
- 0번 인덱스를 기준으로 1~4번 인덱스와 값 비교
- 7, 3 비교
- 3, 2 비교
- 2, 4 비교
- 2, 1 비교
- 1이 최소값이므로 7과 자리 바꿈
[1, 3, 2, 4, 7]
- 1턴 완료 - 1번 인덱스를 기준으로 2~4번 인덱스와 값 비교
- 3, 2 비교
- 2, 4 비교
- 2, 7 비교
- 2가 최소값이므로 3과 자리 바꿈
[1, 2, 3, 4, 7]
- 2턴 완료 - 2번 인덱스를 기준으로 3~4번 인덱스와 값 비교
- 3, 4 비교
- 3, 7 비교
- 3이 최소값이자 기준값이므로 자리 바꿈 없음
[1, 2, 3, 4, 7]
- 3턴 완료 - 3번 인덱스를 기준으로 4번 인덱스와 값 비교
- 4, 7 비교
- 4가 최소값이자 기준값이므로 자리 바꿈 없음
[1, 2, 3, 4, 7]
- 4턴 완료
귀납적 판단
- 기준 인덱스 번호는 0부터 데이터 전체 길이에서 1 뺀 값까지다.
- 기준 인덱스와 비교할 나머지 인덱스 범위는 기준 인덱스에 1 더한 값부터 데이터 전체 길이까지다.
- 기준 인덱스로 비교를 시작하지만 중간에 더 작은 값이 있으면 비교 기준을 바꿔준다.
버블 정렬 알고리즘 시나리오
- 기준 인덱스 범위를 지정해 인덱스 값이 커지도록 반복문을 돌린다.
- 기준 값과 비교할 값의 인덱스 범위를 지정해 반복문을 돌린다.
- 이때 기준 값이 비교할 값보다 크다면 기준 값을 작은 값으로 바꿔준다.
- 2번 반복문을 다 돌리면 기준 값이 제일 작은 값이 되며, 그 값을 가장 앞에 있는 값과 바꿔준다.
코드 작성
def selectionsort(nums):
for standard in range(len(nums)-1):
lowest = standard
for idx in range(standard+1, len(nums)):
if nums[standard] > nums[idx]:
standard = idx
nums[lowest], nums[standard] = nums[standard], nums[lowest]
return nums
검증
import random
# 0부터 99까지 숫자 중 50개를 무작위로 뽑아서 리스트 생성
nums = random.sample(range(100), 50)
print(selectionsort(nums))
복잡도
이중 for문이므로 O(n2)
기억해두기
기준 값 잡고 기준 값을 바꿔주는 방식
for standard in range(len(nums)-1):
lowest = standard
for idx in range(standard+1, len(nums)):
if nums[standard] > nums[idx]:
standard = idx