Perché introsort utilizza heapsort anziché mergesort?


9

Come parte di un compito a casa relativo all'implementazione di introsort, mi viene chiesto perché heapsort viene utilizzato piuttosto che algoritmi di fusione (o altri algoritmi per quella materia). O(nlog(n))

Introsort è un algoritmo di ordinamento ibrido che fornisce sia prestazioni medie veloci che prestazioni (asintoticamente) ottimali nel caso peggiore. Inizia con quicksort e passa a heapsort quando la profondità di ricorsione supera un livello basato sul (logaritmo di) il numero di elementi da ordinare. ( Wikipedia , recuperata il 2014-maggio-06).

L'unica ragione a cui riesco a pensare è che heapsort è "sul posto" ... Ma non capisco davvero perché questo avrebbe importanza qui.


3
Se l'introsort fa parte della domanda, dovrai dirci di cosa si tratta prima di poter dire qualsiasi cosa.
Louis,

1
Benvenuti in Informatica ! Nota che puoi usare LaTeX qui per comporre la matematica in un modo più leggibile. Vedi qui per una breve introduzione.
FrankW,

Ci viene semplicemente chiesto di creare un pseudo codice per l'ordinamento introduttivo e in seguito ci viene chiesto perché utilizza heapsort anziché mergesort.
user672009,

@ user672009 In tal caso, annota il codice per entrambi e vedi cosa trovi. Il motivo può o meno essere correlato alle prestazioni.
Raffaello

2
Ho concluso che dal momento che Quicksort ordina sul posto dobbiamo usare un altro algoritmo di ordinamento sul posto. Tuttavia sono aperto per l'input.
user672009

Risposte:


9

Il rovescio della medaglia di quicksort è che richiede spazio extra (per mantenere gli intervalli non ordinati) e una selezione pivot errata (o sequenze inventate progettate per farti selezionare un pivot cattivo) può far sì che sia un algoritmo tempo e spazio extra.O ( n 2 ) O ( n )O(logn)O(n2)O(n)

Passare a heapsort quando la profondità di ricorsione diventa troppo grande (intorno a ) significa che abbiamo un limite superiore garantito che è tempo e spazio extra.O ( n log n ) O ( log n )lognO(nlogn)O(logn)

Il requisito di spazio aggiuntivo di Heapsort lo rende una scelta migliore per la fusione di dove per un array artificioso che potrebbe essere ancora grande.O ( n ) nO(1)O(n)n

Il motivo per cui heapsort non viene utilizzato per l'ordinamento completo è perché è più lento di quicksort (a causa in parte delle costanti nascoste nell'espressione O grande e in parte al comportamento della cache)


Ma viene usato heapsort ... e sospetto sia perché è in atto come quicksort.
user672009,

Sospetto che @ user672009 sia confuso dalla tua ultima frase. Suggerirei di chiarire che l'introsort non inizia con heapsort perché è più lento.
Wandering Logic,

@ user672009, spazio significa "sul posto", e quicksort non è del tutto a posto perché richiede spazio extra. O ( lg n )O(1)O(lgn)
Wandering Logic,

Inoltre, heapsort ha molti più errori di cache rispetto all'introsort.
noɥʇʎԀʎzɐɹƆ

Una buona implementazione di Quicksort non ha bisogno dello spazio O (n) nel peggiore dei casi, purché ricordi il sottointervallo più grande nello stack e gestisca immediatamente il più piccolo.
gnasher729,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.