[파이썬 알고리즘] 선택정렬(selection sort)이란?
- Python/알고리즘
- 2023. 2. 3.
선택정렬이란?
선택정렬은 아주 단순한 정렬 알고리즘입니다.
최소값을 찾은 후 맨 앞에 데이터와 교체하는 것을 반복하는 방법입니다.
당연히 정리가 끝난 인덱스 이후로 반복해야합니다. 다시 처음부터 하면 안됩니다.
내가 최소값을 선택한 후 그걸 맨 앞으로 끌어오는 작업만 하면 됩니다. 그래서 선택정렬이라고 하는게 아닌가 싶습니다.
출처: https://en.wikipedia.org/wiki/Selection_sort
알고리즘 구현
선택정렬은 최소값을 선택하고 지정한 리스트의 앞의 값이랑 비교를 해야합니다.
맨 앞에 있는 값과 최소값을 비교해 작으면 바꿉니다(swipping)
예를 들어, 데이터가 3개 [16,3,8]라면 처음 한 번 실행할때 [16,3,8]의 최소값인 3과 맨 앞값인 16을 앞으로 넣습니다.
따라서, [3,16,8] 이 됩니다.
두번째는 3은 완료됐으므로 [16,8]에서 최소값인 8을 선택한 후 16과 비교한 후 8이 더 작으니 [3,8,16]순으로 배열합니다.
def selection_sort(data):
for select in range(len(data) - 1):
lowest = select
for index in range(select + 1, len(data)):
if data[lowest] > data[index]:
lowest = index
data[lowest], data[select] = data[select], data[lowest]
return data
선택 for문으로 값을 선택하고 비교 for문을 할 때 범위를 비교가 끝난 인덱스 이후로 잡아주는게 포인트입니다.
import random
data = random.sample(range(100),10)
selection_sort(data)
파이썬 min 함수 이용
min 함수를 통해 파이썬 리스트는 최소값을 도출할 수 있습니다. 이를 이용해서 선택정렬을 보다 직관적인 접근을 할 수 있습니다. 단, while을 써야 합니다.
while로 써도 똑같은 시간복잡도를 갖기 때문에 시간이 줄진 않습니다.
def selection_sort_while(data_list):
count = 0
while len(data_list)>count:
data = data_list[count:]
minvalue = min(data)
min_index = data_list.index(minvalue)
comparevalue = data[0]
comparevalue_index = data_list.index(comparevalue)
if comparevalue>minvalue:
data_list[comparevalue_index] = minvalue
data_list[min_index] = comparevalue
count +=1
else:
count +=1
return data_list
print(data_list)
selection_sort_while(data_list)
for문과 while문의 실제 시간을 비교해보면 그리 차이 나지 않는 걸 볼 수 있습니다.
%timeit selection_sort_while(data_list)
%timeit selection_sort(data_list)
시간복잡도
for문이 두개 입니다. $ O(n^2)$ 됩니다.
실제로 n개의 데이터를 선택정렬 알고리즘으로 정렬을 실행한다면
n+(n-1)+...+1 으로 for문이 돌게 되므로 $ \frac{n(n-1)}{2} $ 가 됩니다.
'Python > 알고리즘' 카테고리의 다른 글
파이썬 입력(input) 사용방법 (0) | 2023.03.20 |
---|---|
인공지능에게 물어보는 알고리즘 공부하는 이유(feat.ChatGPT) (0) | 2023.02.19 |
눈으로 확인하는 정렬 알고리즘 (2) | 2023.01.23 |
[파이썬 알고리즘] 버블 정렬(bubble sort)이란? (0) | 2023.01.18 |
[파이썬 알고리즘] 재귀용법(recursive call, 재귀호출) (2) | 2023.01.12 |