배열을 특정 순서(오름차순/내림차순)로 재배열하는 알고리즘
- "오름차순/내림차순으로 정렬"
- "K번째로 큰/작은 원소" → 정렬 후 인덱싱
- "이분 탐색 전 필수"
- "그리디 알고리즘" → 정렬 후 앞/뒤부터 처리
- "좌표/시간 기준 정렬" → 커스텀 비교 함수
- 대부분 문제에서 STL/내장 정렬 사용! (직접 구현 ❌)
- 안정 정렬 필요 시:
stable_sort(C++) 또는 기본sort(Python)
| 알고리즘 | 평균 | 최악 | 안정성 |
|---|---|---|---|
| 버블 정렬 | O(N²) | O(N²) | ✅ |
| 선택 정렬 | O(N²) | O(N²) | ❌ |
| 삽입 정렬 | O(N²) | O(N²) | ✅ |
| 병합 정렬 | O(NlogN) | O(NlogN) | ✅ |
| 퀵 정렬 | O(NlogN) | O(N²) | ❌ |
| 힙 정렬 | O(NlogN) | O(NlogN) | ❌ |
| 계수 정렬 | O(N+K) | O(N+K) | ✅ |
💡 실전에서는 STL/내장 정렬 사용! (C++:
sort(), Python:sorted())
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> arr = {5, 2, 8, 1, 9};
// 오름차순
sort(arr.begin(), arr.end());
// 내림차순
sort(arr.begin(), arr.end(), greater<int>());
// 커스텀 정렬 (pair: 첫번째 기준 오름차순, 같으면 두번째 기준 내림차순)
vector<pair<int,int>> v = {{1,3}, {1,2}, {2,1}};
sort(v.begin(), v.end(), [](auto& a, auto& b) {
if (a.first != b.first) return a.first < b.first;
return a.second > b.second;
});
return 0;
}arr = [5, 2, 8, 1, 9]
# 오름차순
arr.sort()
# 또는
sorted_arr = sorted(arr)
# 내림차순
arr.sort(reverse=True)
# 커스텀 정렬 (튜플: 첫번째 기준 오름차순, 같으면 두번째 기준 내림차순)
v = [(1,3), (1,2), (2,1)]
v.sort(key=lambda x: (x[0], -x[1]))- 좌표 정렬: (x, y) 정렬 시 x 우선, y 차선
- 안정 정렬: 같은 키값의 상대적 순서 유지 필요 시
- K번째 원소: 정렬 후 인덱싱 or
nth_element(O(N))