정렬 알고리즘 - 선택 정렬(Selection sort)
최솟값과 맨 앞의 값을 서로 자리 바꿈으로써 정렬함!
선택 정렬(selection sort)은 가장 기본적이면서도 데이터가 정렬되는 동작을 직관적으로 이해하기 쉬운 정렬입니다.
선택 정렬은 우선 아직 정렬되지 않은 데이터를 모두 확인하여 가장 작은 값(최솟값)을 찾습니다.
그 다음 찾은 최솟값과 정렬되지 않은 데이터 중 맨 앞에 위치한 값의 위치를 서로 바꿉니다.
이렇게 최솟값을 찾아 맨 앞에 위치한 값과 그 위치를 바꾸는 작업을 반복적으로 수행함으로써 데이터를 정렬합니다.
선택 정렬에서 최솟값을 찾는 작업은 맨 처음에는 n개의 데이터를 살펴봐야 합니다. 그 다음 번에는 방금 자리를 바꾼 1개의 데이터를 제외한 n-1개의 데이터를 살펴봐야 최솟값을 찾을 수 있습니다.
이처럼 최솟값을 찾기 위해서는 이미 정렬된 데이터를 제외한 나머지 데이터만을 살펴보면 되므로, n + (n-1) + (n-2) + … + 2 + 1 이 되고, 평균적으로 1/2 × n개의 데이터를 살펴보면 최솟값을 찾을 수 있습니다.
그와 함께 이렇게 찾은 최솟값과 가장 앞에 위치한 데이터와의 자리를 바꾸는 작업이 총 n번 수행되므로, n개의 데이터를 선택 정렬을 사용하여 정렬하는데 걸리는 시간복잡도는 O(1/2 × n × n) = O(1/2 × n2) ≒ O(n2)이 됩니다.
또한, 찾은 최솟값과 가장 앞에 위치한 데이터와의 자리를 바꾸는 작업만으로 정렬을 수행하므로, 선택 정렬의 공간복잡도는 n이 됩니다.
def selection_sort(data):
for i in range(len(data)-1):
min_index = i
# 정렬되지 않은 데이터 중에서 최솟값인 값의 인덱스를 검색합니다.
for j in range(i+1, len(data)):
if data[j] < data[min_index]:
min_index = j
# 정렬되지 않은 데이터의 첫 번째 값과 최솟값을 서로 바꿉니다.
data[i], data[min_index] = data[min_index], data[i]
print(data)
return data
selection_sort([5, 7, 3, 9, 1, 8, 2, 6, 4])
실행결과
[1, 7, 3, 9, 5, 8, 2, 6, 4]
[1, 2, 3, 9, 5, 8, 7, 6, 4]
[1, 2, 3, 9, 5, 8, 7, 6, 4]
[1, 2, 3, 4, 5, 8, 7, 6, 9]
[1, 2, 3, 4, 5, 8, 7, 6, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
댓글남기기