원리
기준에 맞추어서 데이터를 선택(selection)하면서 옮기는 작업을 수행하는 정렬입니다.데이터를 선택하는 하나의 별도 메모리 공간이 필요합니다.
소스 코드 (구현)
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
template <typename T>
void selection_sort(T *start, T *end, function<bool(const T data1, const T data2)> cmp = [](const T data1, const T data2) { return data1 < data2; })
{
T *ptr = nullptr;
for (T *pos = start; pos < end - 1; pos++)
{
ptr = pos;
for (T *pos2 = pos + 1; pos2 < end; pos2++)
{
if(cmp(*pos2, *ptr))
ptr = pos2;
}
swap(*pos, *ptr);
}
}
int main()
{
int arr[5] = {13, 11, 51, 2, 7};
selection_sort(arr, arr + 5);
for (const auto r : arr)
{
cout << r << ' ';
}
return 0;
}
성능
- 데이터의 비교횟수는 버블 정렬(bubble sort)와 마찬가지로 \(O(n^2)\)이지만 이동횟수는 안쪽 for문 바깥에 존재하므로 n-1의 교환이 일어납니다. 즉 비교연산에 대한 Big O는 \(O(n^2)\), 이동연산에 대한 Big O는 \(O(n)\)입니다.
-
unstable sort입니다.
'알고리즘 Algorithm > 자료구조 Data structure' 카테고리의 다른 글
정렬 (sort) : 힙 정렬 (Heap sort) (0) | 2021.02.25 |
---|---|
정렬 (sort) : 삽입 정렬 (Insertion sort) (0) | 2021.02.24 |
정렬 (sort) : 버블 정렬 (Bubble sort) (0) | 2021.02.24 |
우선순위 큐 (Priority queue) - [C++ STL] (0) | 2021.02.19 |
힙 (Heap) (0) | 2021.02.18 |