Tags
- Django
- Vue
- stack
- Queue
- Tree
- M:N
- 큐
- 스택
- outer join
- 트리
- 그리디
- distinct
- count
- Article & User
- SQL
- regexp
- 통계학
- 이진트리
- ORM
- 백트래킹
- 뷰
- DB
- create
- delete
- drf
- 쟝고
- N:1
- 완전검색
- migrations
- update
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Notice
Recent Posts
Link
데이터 분석 기술 블로그
선택 정렬 (Selection Sort) 본문
선택 정렬
"가장 작은(또는 큰) 값을 선택해서 정렬하는 단순한 정렬 알고리즘"
- 리스트에서 가장 작은 값을 찾아 맨 앞 요소와 교환하는 방식
- 단순하지만 비효율적(O(n²)), 실무에서는 거의 사용되지 않음
선택 정렬 동작 원리
- 리스트에서 가장 작은 값을 찾아 첫 번째 요소와 교환
- 두 번째 요소부터 끝까지 탐색하여, 가장 작은 값을 찾아 두 번째 요소와 교환
- 이 과정을 반복하여 리스트가 완전히 정렬될 때까지 수행
# Pseudo Code
FUNCTION SelectionSort(arr)
FOR i FROM 0 TO length(arr) - 1
min_index = i
FOR j FROM i + 1 TO length(arr) - 1
IF arr[j] < arr[min_index] THEN
min_index = j
END FOR
SWAP arr[i] AND arr[min_index]
END FOR
RETURN arr
END FUNCTION
# Full Code
def selection_sort(arr):
n = len(arr)
for i in range(n - 1): # 총 n-1번 반복
min_index = i # 현재 탐색 범위에서 최소값의 인덱스 저장
for j in range(i + 1, n): # 현재 위치 이후의 값들과 비교
if arr[j] < arr[min_index]: # 더 작은 값을 찾으면 갱신
min_index = j
arr[i], arr[min_index] = arr[min_index], arr[i] # 최소값을 현재 위치로 이동
return arr
# 테스트
arr = [5, 3, 8, 4, 2]
print("선택 정렬 결과:", selection_sort(arr))
선택 정렬의 시간복잡도
경우 | 시간복잡도 |
최선 (이미 정렬됨) | O(n²) |
평균 | O(n²) |
최악 (역순 정렬) | O(n²) |
❌ 모든 경우 O(n²) → 비효율적!
- 항상 리스트에서 최솟값을 찾는 과정(O(n))이 반복(O(n))
- 비교 연산이 많아서 정렬 속도가 느림
✅ 장점: 교환(Swap) 횟수가 적음
- 교환 횟수는 최대 n-1번으로, 버블 정렬보다 적음
- 메모리 이동 비용이 중요한 경우(하드웨어 구현 등)에는 버블 정렬보다 유리
선택 정렬의 장단점
장점
- 구현이 쉽고 직관적
- 추가 메모리 사용이 적음(O(1), 제자리 정렬)
- 교환 횟수가 적어 일부 환경에서는 유리
단점
- O(n²)로 비효율적 (입력 크기가 커지면 성능 저하 심각)
- 이미 정렬된 경우에도 O(n²) 시간이 걸림 → 개선 여지가 없음
- 퀵 정렬(O(n log n))이나 병합 정렬(O(n log n))보다 훨씬 느림
결론
선택 정렬은 이해하기 쉽지만, 성능이 좋지 않아 실무에서 거의 사용되지 않습니다. 대신 퀵 정렬(O(n log n)) 또는 병합 정렬(O(n log n)) 같은 더 효율적인 알고리즘을 사용합니다.
'데이터 사이언스 > 알고리즘' 카테고리의 다른 글
퀵 정렬 (Quick Sort) (0) | 2025.02.13 |
---|---|
삽입 정렬 (Insertion Sort) (0) | 2025.02.12 |
버블 정렬 (Bubble Sort) (0) | 2025.02.10 |
시간복잡도 & 공간복잡도 (0) | 2025.02.09 |
최단경로 (0) | 2024.07.11 |