병합 정렬

리스트를 절반으로 나누고 각 절반을 정렬한 뒤, 정렬된 두 절반을 하나의 정렬된 리스트로 합칩니다.

  • 최선 Ω(n log n)
  • 평균 Θ(n log n)
  • 최악 O(n log n)
  • 메모리 O(n)
  • 안정
  • 추가 메모리 필요
용어 설명
  • 최선: 이 알고리즘에 가장 쉬운 입력일 때, 리스트 크기 n에 따라 시간이 늘어나는 정도.
  • 평균: n에 따라 시간이 늘어나는 보통의 정도. n²이면 값의 개수가 두 배일 때 시간은 약 네 배이고, n log n은 훨씬 천천히 늘어납니다.
  • 최악: 가장 어려운 입력에서 늘어나는 정도. 속도가 절대 떨어지면 안 될 때 중요합니다.
  • 메모리: 리스트 외에 필요한 추가 메모리 양. 1은 변수 몇 개, n은 리스트 복사본 하나를 뜻합니다.
  • 안정: 같은 값 두 개가 원래 순서를 유지합니다. 레코드의 한 필드로 정렬할 때 중요합니다.
  • 추가 메모리 없음: 두 번째 리스트 없이 리스트 안에서 바로 정렬합니다.
  • 비교 중
  • 이동 중
  • 제자리
0 / 263 단계
비교 횟수 쓰기 횟수

재생을 누르면 정렬이 진행되며 비용이 늘어나는 모습이 선으로 보입니다

재생을 누르거나 한 단계씩 진행하세요.

스페이스바: 재생 또는 일시정지. 좌우 화살표 키: 단계 이동. Home과 End 키: 처음과 끝으로 이동.

해 보세요: 같은 값이 많은 리스트를 골라 보세요. 두 값이 같으면 왼쪽 절반의 값을 먼저 가져오므로, 같은 값끼리의 순서가 그대로 유지됩니다.

작동 방식

조각마다 값이 하나만 남을 때까지 계속 나눕니다. 값이 하나뿐이면 이미 정렬된 것입니다. 그다음 조각을 둘씩 다시 합칩니다. 두 조각의 첫 값을 비교해 더 작은 값을 가져오는 일을 반복합니다. 애니메이션에서 위로 올라간 줄은 합치는 동안 쓰는 추가 공간입니다.

나누기합치기52415241524125141245

언제 쓰면 좋을까

최악의 경우에도 속도가 떨어지지 않아야 하고, 같은 값끼리 순서가 유지되어야 할 때 좋습니다. Python과 Java도 병합 정렬을 변형한 방법을 씁니다. 단점은 추가 메모리가 필요하다는 점입니다.

© 2026 Developer Toolbox. 모든 권리 보유. 정보