introsort가 mergesort 대신 heapsort를 사용하는 이유는 무엇입니까?


9

introsort 구현을 다루는 과제 할당의 일환으로 mergesort (또는 그 문제에 대한 다른 알고리즘 대신 heapsort가 사용되는 이유를 묻습니다 . O(nlog(n))

Introsort는 빠른 평균 성능과 (무의식적으로) 최적의 최악의 성능을 모두 제공하는 하이브리드 정렬 알고리즘입니다. 재귀 수준이 정렬되는 요소 수 (로그)에 따라 수준을 초과하면 빠른 정렬로 시작하여 힙 정렬로 전환됩니다. ( Wikipedia , 2014 년 5 월 6 일에 확인 함)

내가 생각할 수있는 유일한 이유는 heapsort가 "제자리에있다"는 것입니다 ...하지만 tbh 왜 이것이 이것이 중요한지 이해하지 못합니다.


3
introsort가 질문의 일부라면, 우리가 무엇을 말하기 전에 그것이 무엇인지 알려 주어야합니다.
Louis

1
컴퓨터 과학에 오신 것을 환영합니다 ! 여기서 LaTeX를 사용하면 좀 더 읽기 쉬운 방식으로 수학을 조판 할 수 있습니다. 짧은 소개는 여기 를 참조 하십시오 .
FrankW

소개 정렬을 위해 의사 코드를 작성하라는 요청을 받았으며 나중에 머지 정렬 대신 힙 정렬을 사용하는 이유를 묻습니다.
user672009

이 경우 어느 쪽이든 코드를 작성하여 찾은 내용을 확인하십시오. 이유는 성능과 관련이있을 수도 있고 그렇지 않을 수도 있습니다.
Raphael

2
나는 퀵 정렬 정렬이 제자리에 있기 때문에 다른 정렬 알고리즘을 사용해야한다고 결론 지었다. 그러나 나는 입력을 위해 열려 있습니다.
user672009

답변:


9

퀵 정렬의 두 가지 단점은 추가 공간 (정렬되지 않은 간격을 유지하기 위해)이 필요하고 잘못된 피벗 선택 (또는 잘못된 피벗을 선택하도록 설계된 파생 된 시퀀스)이 시간과 여분의 공간 알고리즘.O(logn)O(n2)O(n)

재귀 깊이가 너무 클 때 (약 ) 힙 정렬로 전환하면 시간과 여분의 공간 인 보장 된 상한이 있음을 의미 합니다.lognO(nlogn)O(logn)

Heapsort의 추가 공간 요구 사항은 이 여전히 클 수있는 고려 된 배열의 경우 mergsort의 보다 나은 선택 입니다.O(1)O(n)n

힙 정렬이 전체 정렬에 사용되지 않는 이유는 빠른 정렬보다 느리기 때문입니다 (일부 큰 표현식의 숨겨진 상수 및 캐시 동작으로 인해).


그러나 heapsort가 사용됩니다 ... 나는 그것이 quicksort와 같은 장소에 있기 때문이라고 생각합니다.
user672009

@ user672009이 마지막 문장과 혼동 된 것 같습니다. introsort 가 느리기 때문에 heapsort로 시작 하지 않는다는 것을 분명히 제안 합니다.
방황 논리

@ user672009, 공간 "제자리에 있음 "을 의미 하며 quicksort는 추가 공간 이 필요하기 때문에 제대로 배치 되지 않았습니다 . O(1)O(lgn)
방황 논리

또한 heapsort는 introsort보다 더 많은 캐시 누락이 있습니다.
noɥʇʎԀʎzɐɹƆ

좋은 Quicksort 구현은 스택에서 더 큰 하위 간격을 기억하고 더 작은 것을 즉시 처리하는 한 최악의 경우 O (n) 공간이 필요하지 않습니다.
gnasher729
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.