선택 정렬 : 선택 정렬은 0번 인덱스부터 n - 2의 인덱스에 대하여 해당 인덱스에 들어가야 할 원소를 선택하는 알고리즘입니다. 리스트에서 가장 작은(또는 가장 큰) 원소를 찾아 첫 번째 원소와 교환하고, 그 다음 두 번째로 작은 원소를 찾아 두 번째 원소와 교환하는 과정을 n - 1번 반복합니다. n - 1번인 이유는 마지막에 남은 원소는 마지막이 제자리이기 때문!
- 선택 정렬은 O(n^2)의 시간 복잡도를 가집니다.
- 선택 정렬은 불안정 정렬입니다. 동일한 값의 원소들이 입력 순서와 다르게 배치될 수 있습니다.
- 선택 정렬은 추가적인 메모리를 거의 사용하지 않기 때문에 제자리 정렬(In Place Sort, O(1)의 공간 복잡도)입니다.
오름차순 예시
소스 코드
struct Num
{
int idx;
int num;
Num(int idx, int num)
: idx(idx), num(num) {};
};
void AscendingSelectionSort(vector<Num>& arr)
{
for (int i = 0; i < arr.size() - 1; ++i)
{
int minIndex = i;
for (int j = i; j < arr.size(); ++j)
{
if (arr[minIndex].num > arr[j].num)
{
minIndex = j;
}
}
swap(arr[i], arr[minIndex]);
}
}
void DscendingSelectionSort(vector<Num>& arr)
{
for (int i = 0; i < arr.size() - 1; ++i)
{
int minIndex = i;
for (int j = i; j < arr.size(); ++j)
{
if (arr[minIndex].num < arr[j].num)
{
minIndex = j;
}
}
swap(arr[i], arr[minIndex]);
}
}
int main(void)
{
srand(static_cast<unsigned int>(time(NULL)));
vector<Num> v1;
vector<Num> v2;
for (int i = 0; i < 10; ++i)
{
v1.push_back(Num(i, rand() % 6));
v2.push_back(Num(i, rand() % 6));
}
cout << "오름차순 정렬 전 : ";
PrintVector(v1);
AscendingSelectionSort(v1);
cout << "오름차순 정렬 후 : ";
PrintVector(v1);
cout << "정렬 후 idx \t : ";
printVectorIdx(v1);
cout << endl;
cout << "내림차순 정렬 전 : ";
PrintVector(v2);
DscendingSelectionSort(v2);
cout << "내림차순 정렬 후 : ";
PrintVector(v2);
cout << "정렬 후 idx \t : ";
printVectorIdx(v2);
return 0;
}
출력
'알고리즘' 카테고리의 다른 글
부분 수열의 최대합 (1) | 2024.09.05 |
---|---|
합병 정렬 (Merge Sort) (0) | 2024.07.10 |
삽입 정렬 (Insertion Sort) (0) | 2024.07.10 |
버블 정렬 (Bubble Sort) (0) | 2024.07.08 |
Counting Sort (0) | 2022.09.05 |