본문으로 건너뛰기
자료구조 · 알고리즘 기초집LESSON 13

퀵 정렬과 피벗: 평균 성능과 최악 상황 이해하기

난이도초급 → 중급 입문
예상 시간40분
선수지식이전 강의

13강. 퀵 정렬과 피벗: 평균 성능과 최악 상황 이해하기

1. 이번 강의에서 해결할 문제​

제자리 정렬의 장점을 얻고 싶지만 피벗을 잘못 선택하면 이미 정렬된 입력에서 재귀가 한쪽으로 치우칠 수 있습니다.

2. 학습 목표​

3. 핵심 개념​

퀵 정렬은 피벗보다 작거나 같은 값과 큰 값을 분리한 뒤 양쪽을 재귀 정렬합니다. 분할이 균형에 가까우면 깊이 O(log n), 전체 평균 O(n log n)입니다. 매번 가장 작거나 큰 값이 피벗이면 깊이 O(n), 최악 O(n²)과 O(n) 재귀 스택이 됩니다. 무작위 피벗이나 중앙값 근사는 위험을 줄이지만 최악 가능성을 없애는 보장은 아닙니다.

4. 단계별 실습​

1. 예제 파일 작성​

실행 환경: 코드 편집기

실행 위치: C:\dev\game-ranking-algorithms

실행 전 확인: 같은 이름의 파일이 있다면 덮어쓰기 전에 Git diff로 변경 범위를 확인합니다. 선택한 LTS JDK의 java -version과 javac -version이 모두 실행되어야 합니다.

대상 파일: src/QuickSortDemo.java

src/QuickSortDemo.java
import java.util.Arrays;

public class QuickSortDemo {
static void sort(int[] a, int low, int high) {
if (low >= high) return;
int pivotIndex = partition(a, low, high);
sort(a, low, pivotIndex - 1);
sort(a, pivotIndex + 1, high);
}
static int partition(int[] a, int low, int high) {
int mid = low + (high - low) / 2;
swap(a, mid, high);
int pivot = a[high], boundary = low;
for (int i = low; i < high; i++) if (a[i] <= pivot) swap(a, i, boundary++);
swap(a, boundary, high);
return boundary;
}
static void swap(int[] a, int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; }

public static void main(String[] args) {
int[] scores = {1400, 600, 1200, 900, 1200};
sort(scores, 0, scores.length - 1);
System.out.println(Arrays.toString(scores));
}
}

2. PowerShell에서 컴파일·실행​

실행 환경: Windows PowerShell

실행 위치: C:\dev\game-ranking-algorithms

실행 전 확인: src/QuickSortDemo.java가 저장되었고 out 폴더에는 삭제해도 되는 컴파일 결과만 있는지 확인합니다.

대상: src/QuickSortDemo.java와 out 아래 생성되는 class 파일

Windows PowerShell
Set-Location C:\dev\game-ranking-algorithms
New-Item -ItemType Directory -Force .\out | Out-Null
javac -Xlint:all -d .\out .\src\QuickSortDemo.java
java -cp .\out QuickSortDemo

예상 결과: [600, 900, 1200, 1200, 1400]이 출력됩니다.

실행 시간은 PC의 CPU·메모리, JDK 버전, JVM 워밍업, 백그라운드 작업과 입력 분포에 따라 달라질 수 있습니다. 측정값은 같은 조건에서 여러 번 비교하고 Big-O 분석과 함께 해석합니다.

5. 코드와 알고리즘이 동작하는 이유​

partition이 반환한 위치에는 피벗의 최종 값이 놓이고 왼쪽은 피벗 이하, 오른쪽은 피벗 초과라는 불변식이 생깁니다. 배열 자체에서 교환해 별도 배열은 없지만 재귀 스택이 평균 O(log n), 최악 O(n)입니다. 이 구현은 안정 정렬이 아닙니다.

6. 자주 하는 실수와 해결법​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

퀵 정렬과 피벗: 평균 성능과 최악 상황 이해하기 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“퀵 정렬과 피벗: 평균 성능과 최악 상황 이해하기” 실습 결과를 확인할 때 적용해야 할 설명은 무엇인가요?
  2. 문제 2‘평균 O(n log n)을 최악 보장으로 쓰기’ 상태에 관한 “퀵 정렬과 피벗: 평균 성능과 최악 상황 이해하기” 본문의 설명으로 가장 알맞은 것은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

13강. 퀵 정렬과 피벗: 평균 성능과 최악 상황 이해하기 미완료 상태