원리
인덱스가 1인 데이터부터 앞 인덱스에서 맞는 위치를 찾아 삽입하면서 정렬하는 방식입니다. 이 과정에서 데이터를 삽입하기 위해 배열을 한칸씩 미는 작업이 필요합니다.
소스 코드 (구현)
#include <iostream>
#include <functional>
using namespace std;
template <typename T>
void insertion_sort(T *start, T *end, function<bool(const T data1, const T data2)> cmp = [](const T data1, const T data2){ return data1 > data2; })
{
T *insert_data = new T;
for (T *pos = start + 1; pos < end; pos++)
{
T *pos2 = nullptr;
*insert_data = *pos;
for (pos2 = pos - 1; pos2 >= start; pos2--)
{
if(cmp(*pos2, *insert_data))
*(pos2 + 1) = *pos2;
else
break;
}
*(pos2 + 1) = *insert_data;
}
}
int main()
{
int arr[5] = {13, 11, 51, 2, 7};
insertion_sort(arr, arr + 5);
for (const auto r : arr)
{
cout << r << ' ';
}
return 0;
}
성능
- worst case이면 안 쪽 for문의 조건을 탈출하지 못하고 끝까지 수행하므로 버블 정렬과 같은 \(O(n^2)\)의 결과가 나옵니다. 하지만 best case이면 \(O(n)\)의 결과가 나옵니다.
- stable sort 입니다.
'알고리즘 Algorithm > 자료구조 Data structure' 카테고리의 다른 글
정렬 (sort) : 병합 정렬 (Merge sort) (0) | 2021.02.26 |
---|---|
정렬 (sort) : 힙 정렬 (Heap sort) (0) | 2021.02.25 |
정렬 (sort) : 선택 정렬 (Selection sort) (0) | 2021.02.24 |
정렬 (sort) : 버블 정렬 (Bubble sort) (0) | 2021.02.24 |
우선순위 큐 (Priority queue) - [C++ STL] (0) | 2021.02.19 |