선택 정렬 (Selection Sort)
선택 정렬은 단순하지만 비효율적인 정렬 알고리즘으로, 배열의 모든 요소를 반복하면서 가장 작은 값을 찾아 해당 값을 정렬되지 않은 부분의 첫 번째 요소와 교환하는 방식으로 동작합니다.
1. 작동 방식
- 배열의 첫 번째 요소를 정렬되지 않은 부분의 시작점으로 간주합니다.
- 정렬되지 않은 부분에서 가장 작은(혹은 가장 큰) 값을 찾습니다.
- 해당 값을 정렬되지 않은 부분의 첫 번째 요소와 교환합니다.
- 정렬되지 않은 부분의 시작점을 다음 요소로 이동합니다.
- 배열의 모든 요소가 정렬될 때까지 반복합니다.
2. 특징
- 시간 복잡도:
- 최선, 평균, 최악: O(n^2)
- 공간 복잡도:
- 추가 메모리 사용이 거의 없음: O(1)
- 불안정 정렬:
- 데이터의 상대적인 순서를 보장하지 않습니다.
3. 작동 예제
배열: [64, 25, 12, 22, 11]
- 첫 번째 반복:
- 최소값: 11
- 교환: 11과 64 → [11, 25, 12, 22, 64]
- 두 번째 반복:
- 최소값: 12
- 교환: 12와 25 → [11, 12, 25, 22, 64]
- 세 번째 반복:
- 최소값: 22
- 교환: 22와 25 → [11, 12, 22, 25, 64]
- 네 번째 반복:
- 최소값: 25
- 교환: 25와 25 → [11, 12, 22, 25, 64]
- 다섯 번째 반복:
- 정렬 완료.
4. 장점과 단점
장점:
- 구현이 간단하고 이해하기 쉽습니다.
- 추가 메모리를 거의 사용하지 않습니다.
단점:
- 시간 복잡도가 O(n^2)이므로, 데이터 크기가 커질수록 비효율적입니다.
- 정렬의 안정성이 없습니다.
반응형
5. Java 예제 코드
import java.util.Arrays;
public class SelectionSort {
public static void selectionSort(int[] arr) {
int n = arr.length;
// 하나씩 배열의 요소를 정렬
for (int i = 0; i < n - 1; i++) {
// 정렬되지 않은 부분에서 최소값 찾기
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
// 최소값을 현재 위치와 교환
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}
public static void main(String[] args) {
int[] arr = {64, 25, 12, 22, 11};
System.out.println("Original Array: " + Arrays.toString(arr));
selectionSort(arr);
System.out.println("Sorted Array: " + Arrays.toString(arr));
}
}
6. Python 예제 코드
def selection_sort(arr):
n = len(arr)
for i in range(n):
# Find the index of the smallest element in the unsorted part
min_index = i
for j in range(i + 1, n):
if arr[j] < arr[min_index]:
min_index = j
# Swap the smallest element with the first element of the unsorted part
arr[i], arr[min_index] = arr[min_index], arr[i]
# Example usage
if __name__ == "__main__":
arr = [64, 25, 12, 22, 11]
print("Original Array:", arr)
selection_sort(arr)
print("Sorted Array:", arr)
7. 동작 최적화
- 최적화된 루프 종료:
- 현재 정렬된 부분에서 더 이상 교환이 필요하지 않으면 중단.
- 불필요한 교환 최소화:
- 값이 이미 제자리일 경우, 교환을 생략하여 실행 시간을 줄일 수 있음.
8. 활용 사례
- 데이터 크기가 작거나, 간단한 정렬 알고리즘이 필요한 경우.
- 추가 메모리 사용을 피해야 할 경우.
선택 정렬은 이해하기 쉬운 알고리즘이지만, 성능이 좋지 않아 실무보다는 학습용이나 데이터 크기가 작은 상황에서 주로 사용됩니다.
반응형
'컴퓨터과학 > 알고리즘' 카테고리의 다른 글
정렬 알고리즘 (Sorting Algorithms) - 힙 정렬 (Heap Sort) (0) | 2024.12.28 |
---|---|
정렬 알고리즘 (Sorting Algorithms) - 삽입 정렬 (Insertion Sort) (1) | 2024.12.27 |
정렬 알고리즘 (Sorting Algorithms) - 병합 정렬 (Merge Sort) (1) | 2024.12.26 |
정렬 알고리즘 (Sorting Algorithms) - 퀵 정렬 (Quick Sort) (0) | 2024.12.26 |
정렬 알고리즘 (Sorting Algorithms) - 버블 정렬 (Bubble Sort) (0) | 2024.12.24 |