Published
- 4 min read
[ Algorithm ] Selection Sort(선택 정렬)
선택 정렬(Selection Sort)
선택 정렬은 간단한 정렬 알고리즘 중 하나이다
- 목록을 총 N-1번 훑으면서 다음 과정을 반복한다
- 첫 번째 요소 0부터 훑으면서 최솟값을 찾아 요소 0과 교환
- 두 번째는 요소 1부터 훑으면서 최솟값을 찾아 요소 1과 교환
- 세 번째는 요소 2부터 훑으면서 최솟값을 찾아 요소 2와 교환
- N-1번째까지 반복
- 최솟값을 찾아 선택한다고 해서 ‘선택 정렬’이라고 부른다.
선택 정렬은 정수 컬렉션에서 반복적으로 최소 요소를 찾아 목록의 앞쪽으로 이동시켜 정렬된 리스트를 만든다. 전체 리스트가 정렬될 때까지 요소를 적절히 교환한다.
특징
- 직관적이고 구현이 간단하다.
- 시간 복잡도: 최악의 경우 O(n^2)
- 공간 복잡도: O(1) (추가 공간 사용 없음, 제자리 정렬)
- 안정적이지 않은(not stable) 정렬 알고리즘이다.
Java 구현
public static void selectionSort(int[] nums) {
for (int i = 0; i < nums.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] < nums[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
int temp = nums[minIndex];
nums[minIndex] = nums[i];
nums[i] = temp;
}
}
}
예제 문제: Sort Colors
주어진 문제는 빨강, 흰색, 파랑으로 색칠된 n개의 객체가 있는 배열 nums
를 정렬하는 것이다. 같은 색의 객체들이 인접하도록 제자리(in-place) 정렬해야 하며, 색상 순서는 빨강, 흰색, 파랑 순이어야 한다.
- 0, 1, 2는 각각 빨강, 흰색, 파랑을 나타낸다.
- 라이브러리의 정렬 함수를 사용하지 않고 해결해야 한다.
해결책
class Solution {
public void sortColors(int[] nums) {
for (int i = 0; i < nums.length; i++) {
int minIndex = i;
for (int j = i + 1; j < nums.length; j++) {
if (nums[minIndex] >= nums[j]) {
minIndex = j;
}
}
int temp = nums[i];
nums[i] = nums[minIndex];
nums[minIndex] = temp;
}
}
}
이 해결책은 선택 정렬을 사용하여 문제를 해결한다. 각 반복에서 현재 위치 이후의 가장 작은 값을 찾아 현재 위치와 교환한다. 이 과정을 배열의 모든 요소에 대해 반복하여 전체 배열을 정렬한다.
선택 정렬은 이 문제에 대해 올바른 해결책을 제공하지만, 대규모 데이터셋에 대해서는 효율적이지 않을 수 있다. 이 특정 문제의 경우, 값이 0, 1, 2로 제한되어 있으므로 계수 정렬(counting sort)과 같은 더 효율적인 알고리즘을 사용할 수 있다.