정렬을 직접 짜지 말자
데이터를 크기순으로 줄 세우는 일은 너무 흔해서, 모든 언어가 빠른 정렬 함수를
기본 제공합니다. 직접 짠 정렬보다 빠르고 정확하니, 정렬이 필요하면 내장 함수를
쓰는 게 정답입니다.
1. 기본 정렬 (오름차순)
#include <algorithm>
int a[5] = {3, 1, 4, 1, 5};
sort(a, a + 5); // 배열: 시작, 끝 다음
// vector면: sort(v.begin(), v.end());
a = [3, 1, 4, 1, 5]
a.sort() # 원본을 정렬
b = sorted(a) # 정렬된 새 리스트 반환
C++ sort는 평균 \(O(N \log N)\)으로 매우 빠릅니다. 직접 짠 \(O(N^2)\) 정렬과는
비교가 안 됩니다.
2. 내림차순
sort(a, a + 5, greater<int>()); // 큰 것부터
a.sort(reverse=True)
3. 기준을 직접 정하기 (비교 함수)
"키 순, 같으면 이름 순"처럼 정렬 기준을 직접 정할 수 있습니다.
struct Person { int height; string name; };
bool cmp(const Person& a, const Person& b) {
if (a.height != b.height) return a.height < b.height; // 키 오름차순
return a.name < b.name; // 같으면 이름순
}
sort(people, people + n, cmp);
people.sort(key=lambda p: (p[0], p[1])) # 첫째 기준, 같으면 둘째
비교 함수는 "a가 b보다 앞에 와야 하면 true" 를 돌려주도록 짭니다. 파이썬은
key에 "정렬에 쓸 값"을 주면 알아서 비교합니다(튜플로 우선순위 표현).
4. 정렬이 푸는 문제들
- 중앙값·최댓값·k번째 값 찾기.
- "가장 적게/많이"류 그리디.
- 정렬해 두면 이분 탐색이 가능.
- 같은 값 묶기(정렬 후 인접 비교).
복잡도
내장 정렬은 \(O(N \log N)\)입니다. \(N = 10^6\)이어도 약 \(2 \times 10^7\) 수준이라
충분히 빠릅니다.
정리
- 정렬은 직접 짜지 말고 내장 함수(
sort/.sort()). - 오름차순 기본, 내림차순은
greater/reverse=True. - 기준은 비교 함수(C++) /
key(파이썬)로 자유롭게. - 복잡도 \(O(N \log N)\) — 빠르고 안전.