힙 정렬
리스트를 힙으로 바꿉니다. 힙은 모든 부모가 자식보다 큰 트리입니다. 그다음 최댓값을 끝으로 옮기는 일을 반복합니다.
- Ω(n log n)
- Θ(n log n)
- O(n log n)
- O(1)
- 아니요
- 예
최선: 이 알고리즘에 가장 쉬운 입력일 때, 리스트 크기 n에 따라 시간이 늘어나는 정도.
평균: n에 따라 시간이 늘어나는 보통의 정도. n²이면 값의 개수가 두 배일 때 시간은 약 네 배이고, n log n은 훨씬 천천히 늘어납니다.
최악: 가장 어려운 입력에서 늘어나는 정도. 속도가 절대 떨어지면 안 될 때 중요합니다.
메모리: 리스트 외에 필요한 추가 메모리 양. 1은 변수 몇 개, n은 리스트 복사본 하나를 뜻합니다.
안정: 같은 값 두 개가 원래 순서를 유지합니다. 레코드의 한 필드로 정렬할 때 중요합니다.
추가 메모리 없음: 두 번째 리스트 없이 리스트 안에서 바로 정렬합니다.
- 비교 중
- 이동 중
- 제자리
해 보세요: 역순 리스트를 골라 보세요. 힙을 만들 때는 교환이 거의 없고, 그다음 매번 최댓값이 끝으로 갑니다.
작동 방식
힙은 리스트 안에 그대로 저장됩니다. i번 자리 값의 자식은 2i+1번과 2i+2번 자리에 있고, 최댓값은 언제나 맨 앞에 있습니다. 최댓값을 끝으로 교환하고, 힙을 하나 줄인 뒤 고칩니다. 정렬된 부분은 오른쪽부터 늘어납니다.
언제 쓰면 좋을까
최악의 경우에도 속도가 떨어지지 않아야 하고 추가 메모리를 쓸 수 없을 때 좋습니다. 작은 기기가 그런 예입니다. 평균적으로는 퀵 정렬보다 느려서 안전장치로 자주 쓰입니다.