선택 정렬(Selection Sort)은 단순하지만 비효율적인 정렬 알고리즘 중 하나이다. 주어진 배열에서 현재 위치에 저장될 값의 크기에 따라 최소 선택 정렬(오름차순)과 최대 선택 정렬(내림차순)로 나뉜다. 각 단계에서 최소값 또는 최대값을 찾아 현재 위치에 놓는 방식으로 정렬을 진행한다.
public class SelectionSort {
public static void sort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) { // 마지막 원소는 자동 정렬
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) { // 기준 이후의 원소들 탐색
if (arr[j] < arr[minIndex]) {
minIndex = j; // 최소값의 인덱스 갱신
}
}
// 최소값과 기준 위치의 값 교환
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
// 단계별 결과 출력
print(arr, i + 1);
}
}
private static void print(int[] arr, int step) {
System.out.print(step + "단계 : ");
for (int value : arr) {
System.out.print(value + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {7, 6, 2, 4, 3, 9, 1};
sort(arr);
}
}
1단계 : 1 6 2 4 3 9 7
2단계 : 1 2 6 4 3 9 7
3단계 : 1 2 3 4 6 9 7
4단계 : 1 2 3 4 6 9 7
5단계 : 1 2 3 4 6 9 7
6단계 : 1 2 3 4 6 7 9
선택 정렬의 시간 복잡도는 다음과 같다:
선택 정렬은 항상 두 개의 중첩 루프를 사용하여 각 원소를 비교하고 최소값을 찾는 구조이므로, 최선, 최악, 평균의 경우 모두 O(N^2)의 시간 복잡도를 가진다.
선택 정렬은 주어진 배열 안에서 교환을 통해 정렬이 수행되므로 추가적인 메모리 공간이 필요하지 않다. 따라서 공간 복잡도는 O(1)이다.
선택 정렬은 단순한 알고리즘으로, 학습 목적으로 사용되거나 작은 데이터셋에 대해 사용할 수 있다. 그러나 큰 데이터셋에 대해서는 비효율적이므로 퀵 정렬, 합병 정렬 등 더 효율적인 정렬 알고리즘을 사용하는 것이 좋다.
선택 정렬은 단순한 알고리즘으로, 작은 데이터셋이나 학습 목적으로 유용하다. 그러나 큰 데이터셋에 대해서는 비효율적이며, 불안정 정렬이기 때문에 동일한 값의 원소 순서가 유지되지 않는다. 오늘 학습을 통해 선택 정렬의 동작 원리와 장단점을 이해하고, 이를 적절히 활용할 수 있는 상황을 파악할 수 있었다.