정렬은 데이터를 정해진 기준(예: 오름차순, 내림차순 등)에 따라 순서대로 배열하는 과정입니다.
정렬이 중요한 이유는 바로 탐색 효율 때문입니다. 예를 들어 이진 탐색은 정렬이 되어 있어야 사용할 수 있습니다.
int main()
{
vector<int> v{ 1, 5, 3, 4, 2 };
std::sort(v.begin(), v.end()); // C++ STL 정렬 (참고용)
BubbleSort(v); // 버블 정렬
SelectionSort(v); // 선택 정렬
InsertionSort(v); // 삽입 정렬
}
세 정렬 모두 동일한 벡터
v를 사용합니다. 각각 정렬 전 상태로 초기화하고 적용하면 됩니다.
void BubbleSort(vector<int>& v)
{
const int n = (int)v.size();
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < (n - 1 - i); j++)
{
if (v[j] > v[j + 1])
{
int temp = v[j];
v[j] = v[j + 1];
v[j + 1] = temp;
}
}
}
}
N * (N-1) / 2 → O(N²) 시간 복잡도void SelectionSort(vector<int>& v)
{
const int n = (int)v.size();
for (int i = 0; i < n - 1; i++)
{
int bestIdx = i;
for (int j = i + 1; j < n; j++)
{
if (v[j] < v[bestIdx])
bestIdx = j;
}
int temp = v[i];
v[i] = v[bestIdx];
v[bestIdx] = temp;
}
}
void InsertionSort(vector<int>& v)
{
const int n = (int)v.size();
for (int i = 1; i < n; i++)
{
int insertData = v[i];
int j;
for (j = i - 1; j >= 0; j--)
{
if (v[j] > insertData)
v[j + 1] = v[j];
else
break;
}
v[j + 1] = insertData;
}
}
| 정렬 방식 | 핵심 원리 | 평균/최악 시간 복잡도 | 특징 |
|---|---|---|---|
| 버블 정렬 | 인접한 두 값 비교 후 swap | O(N²) | 구현 단순하지만 가장 비효율적 |
| 선택 정렬 | 최소값 찾아 위치 교환 | O(N²) | 교환 횟수 적음 |
| 삽입 정렬 | 앞쪽 정렬 구간에 삽입 | O(N²), 최선 O(N) | 정렬된 데이터에 유리 |