선택 정렬(Selection Sort)
간단하지만 비효율적인 정렬 알고리즘입니다.
특징
- 불안정 정렬(Unstable Sort): 동일한 값에 대해 상대적인 순서가 유지되지 않을 수 있습니다.
- 제자리 정렬(In-place Sort): 입력 배열 이외에 추가적인 메모리를 사용하지 않습니다. 입력 배열 내에서 정렬이 수행됩니다.
- 비교 기반 정렬(Comparison Sort): 원소들의 상대적인 크기를 비교하여 정렬합니다.
알고리즘 동작 방식
- 주어진 배열에서 가장 작은 값을 찾습니다.
- 찾은 가장 작은 값을 현재 정렬되지 않은 부분 배열의 첫 번째 원소와 교환합니다.
- 정렬되지 않은 부분 배열의 범위를 하나씩 옮겨가며 위의 과정을 반복합니다.
장점
- 구현이 간단하고 이해하기 쉽습니다.
- 제자리 정렬이므로 메모리 사용량이 작습니다.
단점
- 평균 및 최악의 경우에 대해 O(n^2)의 시간 복잡도를 가집니다. 모든 원소를 비교하고 교환해야 하기 때문에 비효율적입니다.
- 대량의 데이터를 정렬할 때는 다른 알고리즘들보다 성능이 떨어질 수 있습니다.
- 불안정 정렬이므로 동일한 값의 원소들의 상대적인 순서가 변할 수 있습니다.
요약
선택 정렬은 구현이 간단하고 작은 입력에 대해서는 효율적인 정렬 알고리즘입니다.
그러나 대량의 데이터에 대해서는 다른 알고리즘들보다 성능이 떨어지며, 최악의 경우에는 시간 복잡도가 O(n^2)이기 때문에 효율적인 알고리즘이라고는 할 수 없습니다.
또한 불안정 정렬이기 때문에 동일한 값의 원소들의 상대적인 순서가 변할 수 있습니다.
void DoSelectionSort()
{
int arr[MAX_LENGTH];
cout << "Before Sort" << endl;
for (int i = 0; i < MAX_LENGTH; i++)
{
arr[i] = rand() % 100;
cout << arr[i] << " ";
}
cout << endll;
cout << "After Sort" << endl;
SelectionSort(arr, MAX_LENGTH);
for (auto num : arr)
cout << num << " ";
cout << endll;
Pause;
return;
}
void SelectionSort(int arr[], int length)
{
int index;
for (int i = 0; i < length - 1; i++)
{
index = i;
for (int j = i + 1; j < length; j++)
if (arr[j] > arr[index])
index = j;
swap(arr[index], arr[i]);
}
}
기본참고 코드
#include <iostream>
#include <algorithm>
#include <queue>
#include <cmath>
#include <string>
#include <vector>
#include <stack>
#include <map>
#include <unordered_map>
#include <fstream>
#include <ostream>
#include <sstream>
#include <cctype>
#include <cmath>
#define fastio cin.tie(0)->ios::sync_with_stdio(0); cout.tie(0);
using namespace std;
int main()
{
fastio;
int i, j, min, index, temp;
int array[10] = { 1,10,5,8,7,6,4,3,2,9 };
for (int i = 0; i < 10; i++)
{
min = INT_MAX;
for (j = i; j < 10; j++)
{
if (min > array[j])
{
min = array[j];
index = j;
}
}
swap(array[i], array[index]);
//algorithm 을 포함하지 않았을때 사용하는 스왑
//temp = array[i];
//array[i] = array[index];
//array[index] = temp;
}
for (int i = 0; i < 10; i++)
{
printf("%d ", array[i]);
}
return 0;
}
'알고리즘' 카테고리의 다른 글
[알고리즘] 버블 정렬(Bubble Sort) (0) | 2023.07.16 |
---|---|
[알고리즘] 삽입 정렬(Insertion Sort) (0) | 2023.07.16 |
[알고리즘] 다익스트라 알고리즘(Dijkstra Algorithm) (0) | 2023.07.12 |
[알고리즘] A*알고리즘(Astar Algorithm) (0) | 2023.07.12 |
[알고리즘] 보간 (interpolation) (0) | 2023.05.22 |
댓글