자료구조
자료구조 - 선택 정렬
tita
2024. 6. 11. 13:34
[선택 정렬(Selection Sort)]
선택 정렬(Selection Sort)은 정렬 알고리즘 중 하나로, 리스트를 순차적으로 탐색하면서 가장 작은(혹은 큰) 값을 선택해 정렬된 부분의 뒤에 위치시키는 방식입니다.
선택 정렬은 간단하지만 효율성 면에서는 다른 정렬 알고리즘보다 떨어집니다.
시간 복잡도는 O(n^2)입니다.
선택 정렬 과정
- 리스트의 첫 번째 요소부터 시작하여, 남아있는 요소들 중에서 가장 작은 요소를 찾아 첫 번째 요소와 교환합니다.
- 두 번째 요소부터 시작하여 남아있는 요소들 중에서 가장 작은 요소를 찾아 두 번째 요소와 교환합니다.
- 이 과정을 리스트의 마지막까지 반복합니다.
선택 정렬 의사코드
함수 selectionSort(arr):
n = 배열의 길이(arr)
for i = 0부터 n-1까지:
최소 인덱스(min_idx) = i
for j = i+1부터 n까지:
if arr[j] < arr[min_idx]:
min_idx = j // 가장 작은 값을 찾음
// 찾은 최소 값을 현재 위치로 교환
arr[i]와 arr[min_idx] 교환
반환 arr
선택 정렬 예제
예시 리스트: [64, 25, 12, 22, 11]
첫 번째 반복:
전체 리스트에서 가장 작은 값(11)을 찾아 첫 번째 요소(64)와 교환.
결과: [11, 25, 12, 22, 64]
두 번째 반복:
나머지 리스트(25, 12, 22, 64)에서 가장 작은 값(12)을 찾아 두 번째 요소(25)와 교환.
결과: [11, 12, 25, 22, 64]
세 번째 반복:
나머지 리스트(25, 22, 64)에서 가장 작은 값(22)을 찾아 세 번째 요소(25)와 교환.
결과: [11, 12, 22, 25, 64]
네 번째 반복:
나머지 리스트(25, 64)에서 가장 작은 값(25)을 찾아 네 번째 요소(25)와 교환(자기 자신과 교환).
결과: [11, 12, 22, 25, 64]
다섯 번째 반복:
마지막 요소는 이미 정렬된 상태.
결과: [11, 12, 22, 25, 64]
선택 정렬 코드
#include <iostream>
#include <vector>
using namespace std;
// 선택 정렬 함수
void selectionSort(vector<int>& arr)
{
int n = arr.size(); // 배열의 길이
for (int i = 0; i < n - 1; i++)
{
int min_idx = i; // 최소값의 인덱스를 현재 인덱스로 초기화
// 현재 인덱스 i 이후의 모든 요소들을 탐색
for (int j = i + 1; j < n; j++)
{
if (arr[j] < arr[min_idx])
{
min_idx = j; // 최소값의 인덱스를 업데이트
}
}
// 현재 인덱스 i와 최소값의 인덱스 min_idx의 값을 교환
swap(arr[i], arr[min_idx]);
}
}
int main()
{
vector<int> arr = {64, 25, 12, 22, 11}; // 예제 리스트
cout << "정렬 전: ";
for (int i : arr)
{
cout << i << " ";
}
cout << endl;
selectionSort(arr); // 선택 정렬 수행
cout << "정렬 후: ";
for (int i : arr)
{
cout << i << " ";
}
cout << endl;
return 0;
}