6강 / 20강
정렬 — 인기순 · 가격순 목록 만들기
같은 결과를 만드는 다섯 가지 방법, 그리고 어마어마한 비용 차이
쇼핑몰 화면에서 손님이 가장 많이 누르는 버튼이 무엇일까요? "낮은 가격순", "인기순", "최신순" — 전부 정렬입니다.
그리고 5강에서 배운 이진 탐색도, 앞으로 배울 순위 집계도 전부 "정렬되어 있다"를 전제로 합니다. 정렬은 알고리즘 세계에서 가장 많이 쓰이는 도구예요.
느린 정렬 세 가지 — O(n²)
사람이 자연스럽게 떠올리는 방법들은 대부분 O(n²)입니다.
- 버블 정렬 — 옆 사람과 비교해서 크면 자리를 바꾼다. 계속 반복.
- 선택 정렬 — 남은 것 중 가장 작은 걸 골라 맨 앞에 놓는다.
- 삽입 정렬 — 카드 게임처럼, 손에 든 카드를 알맞은 자리에 끼워 넣는다.
8개 정렬에 28번 비교. n이 커지면?
Python
브라우저에서 실행
빠른 정렬 두 가지 — O(n log n)
병합 정렬과 퀵 정렬은 완전히 다른 아이디어를 씁니다. 쪼개서 정복하기(분할 정복)예요.
- 병합 정렬 — 반으로 쪼개고, 또 쪼개고, 하나가 되면 정렬하면서 합친다. 항상 O(n log n). 안정적.
- 퀵 정렬 — 기준값(피벗) 하나를 잡고 작은 것은 왼쪽, 큰 것은 오른쪽으로 나눈 뒤 각각 다시 정렬. 보통 가장 빠르지만 최악에는 O(n²).
쪼개고 → 정렬하며 합치기. 이것이 분할 정복입니다.
Python
브라우저에서 실행
🎮 정렬 경주
다섯 가지 정렬을 같은 데이터로 돌려 봅시다. 막대가 움직이는 모양이 알고리즘마다 완전히 다릅니다. 개수를 12 → 60으로 늘리면서 비교 횟수가 어떻게 벌어지는지 보세요.
실제 비용 — 상품 3만 개를 정렬하면
| 알고리즘 | 복잡도 | n = 30,000 일 때 비교 횟수 |
|---|---|---|
| 버블 · 선택 · 삽입 | O(n²) | 약 9억 번 💀 |
| 병합 · 퀵 · 파이썬 sorted | O(n log n) | 약 45만 번 |
2,000배 차이입니다. 같은 결과를 만드는데요.
3,000개만으로도 이 정도 차이입니다. 30,000개면 100배 더 벌어져요.
Python
브라우저에서 실행
🤔 확인 문제
상품 30,000개를 버블 정렬로 정렬하면 비교 횟수는 대략?
해설 O(n²) = 30,000² / 2 ≈ 4.5억~9억 번입니다. O(n log n)인 sorted()는 약 45만 번이에요. 2,000배 차이.
🤔 확인 문제
병합 정렬과 퀵 정렬이 O(n²)보다 빠른 근본 이유는?
해설 분할 정복입니다. 반씩 쪼개면 깊이가 log n 이 되고, 각 깊이에서 n번 일하므로 n log n이 됩니다. 5강의 이진 탐색과 같은 아이디어예요.
🤔 확인 문제
데이터를 한 번만 검색할 예정입니다. 정렬 후 이진 탐색과 그냥 선형 탐색 중 무엇이 유리할까요?
해설 정렬은 O(n log n), 선형 탐색은 O(n). 한 번 찾자고 정렬하면 손해입니다. 여러 번 찾을 때만 정렬이 이득이에요.