더북(TheBook)

sort_heap() 함수에는 힙을 생성할 때 사용한 조건자를 세 번째 매개변수로 지정할 수 있는 버전도 있다. 힙 생성에 사용한 조건자가 greater<>였다면 최소 힙이 되고, sort_heap()을 실행한 결과는 원소들을 내림차순으로 정렬한 것이 된다. 최소 힙을 정렬한 결과는 최소 힙이 될 수 없다. 다음은 이를 설명하는 코드 조각이다.

std::vector<double> numbers {2.5, 10.0, 3.5, 6.5, 8.0, 12.0, 1.5, 6.0};
std::make_heap(std::begin(numbers), std::end(numbers),
               std::greater<>()); // 결과: 1.5 6 2.5 6.5 8 12 3.5 10
std::sort_heap(std::begin(numbers), std::end(numbers),
               std::greater<>()); // 결과: 12 10 8 6.5 6 3.5 2.5 1.5

마지막 줄의 주석에 표시한 것처럼 최소 힙에 sort_heap()을 실행한 결과는 최대 힙이 된다.

algorithm 헤더에는 힙을 정렬할 수 있는 sort() 함수 템플릿이 정의되어 있는데, 왜 sort_heap() 함수가 있을까? sort_heap() 함수는 엄청난 우연일 뿐이지만 힙 정렬(Heap Sort)이라 불리는 특별한 정렬 함수를 사용한다. sort_heap() 함수는 힙을 만들고, 데이터가 부분적으로 정렬되어 있다는 사실을 이용해 데이터를 정렬한다. 힙의 부분 정렬을 이용하기 때문에 정렬을 더 빨리할 가능성이 있다. 물론, 항상 이렇게 되는 것은 아니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.