[알고리즘] 선택 정렬 알고리즘(Selection sort)

2022년 2월 25일

선택 정렬(Selection Sort)이란?

선택 정렬의 원리

정렬되지 않은 원소 중 가장 작은 원소를 찾아 정렬된 요소의 끝에 배치한다. 즉, 배열의 요소 중에서 최소값을 발견한 다음, 이 최소값을 배열의 첫번째 요소와 교환환다. 첫번째 요소를 제외한 나머지 요소들 중에서 가장 작은 값을 선택하고 이를 두번째 요소와 교환한다. 이 과정을 배열이 정렬될 때까지 반복한다. 선택 정렬은 가장 이해하기 쉬운 정렬 방법이고 매번 가장 작은 것을 선택한다는 의미에서 선택 정렬(Selection Sort)이라 한다.


Quote

In-place vs. Not In-place

선택 정렬과 같이 다른 추가적인 메모리를 요구하지 않는 정렬 방법을 In-place 정렬 알고리즘이라 한다. 반대로 추가적인 메모리 공간이 필요로하는 알고리즘은 Not In-place 정렬 알고리즘이라 한다.


대표적인 In-place 정렬 알고리즘으로는 선택 정렬(Selection Sort), 삽입 정렬(Insertion Sort), 버블 정렬(Bubble Sort), 쉘 정렬(Shell Sort), 힙 정렬(Heap Sort), 퀵 정렬(Quick Sort)(정의에 따라서 Not In-place 로 볼 수도 있으나 흔히 In-place로 본다.)이 있고, Not In-place 정렬 알고리즘으로는 병합 정렬(Merge Sort), 계수 정렬(Counting Sort), 기수 정렬(Radix Sort) 등이 있다.

GIF로 보는 선택 정렬

selection-sort


코드 구현

자바스크립트 코드

const selectionSort = dataList => {
for (let i = 0; i < dataList.length; i++) {
let minIdx = i;
for (let j = i + 1; j < dataList.length; j++) {
if (dataList[minIdx] > dataList[j]) minIdx = j;
}
[dataList[minIdx], dataList[i]] = [dataList[i], dataList[minIdx]];
}
return dataList;
};
const dataList = [43, 21, 40, 18, 25, 24, 47, 8, 5, 35];
console.log(selectionSort(dataList));
// [5, 8, 18, 21, 24, 25, 35, 40, 43, 47]

파이썬 코드

def selection_sort(data):
for i in range(len(data)):
min_idx = i
for j in range(i + 1, len(data)):
if data[min_idx] > data[j]:
min_idx = j
data[min_idx], data[i] = data[i], data[min_idx]
return data
data_list = [43, 21, 40, 18, 25, 24, 47, 8, 5, 35]
print(selection_sort(data_list))
# [5, 8, 18, 21, 24, 25, 35, 40, 43, 47]

선택 정렬의 시간 복잡도

선택 정렬은 소스코드 상으로 간단한 형태의 2중 반복문이 사용되었는데 n1n-1번 만큼 가장 작은 값을 찾아서 맨 앞으로 교체해야 한다. 그리고 가장 작은 값을 찾는 과정이 매번 내부 루프안에서 발생한다. 연산 횟수는 (n1)+(n2)+...+1(n - 1) + (n - 2) + ... + 1로 볼 수 있다. 이는 n(n1)/2n(n - 1) / 2 로 표현할 수 있고, 빅오 표기법으로 간단히 O(n2)O(n^2)이라고 표현할 수 있다. 따라서 선택 정렬의 시간 복잡도는 O(N2)O(N^2) 이다.

최악평균최선
O(N2)O(N^2)O(N2)O(N^2)O(N2)O(N^2)

선택 정렬의 장단점

장점

  • 적은 개수의 원소를 정렬할 때 성능이 좋다.
  • in-place 정렬 알고리즘이기 때문에 원소들의 개수보다 무시할만한 저장공간을 더 사용한다(추가적인 메모리 공간 사용이 적다).

단점

  • 많은 개수의 데이터를 처리할 때 효율성(efficiency)이 떨어진다.
  • 선택 정렬에는 nn개의 요소를 정렬하기 위한 n2n^2 단계가 필요하다.


참고

선택 정렬(Selection Sort)이란?
선택 정렬의 원리
GIF로 보는 선택 정렬
코드 구현
자바스크립트 코드
파이썬 코드
선택 정렬의 시간 복잡도
선택 정렬의 장단점
장점
단점
참고
Kihoon
기록하는 프론트엔드 개발자

이전 포스트
이진 트리(binary tree)와 이진 탐색 트리(binary search tree)
다음 포스트
[알고리즘] 삽입 정렬 알고리즘(Insertion sort)