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(log⁡n)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 )log⁡nO(nlog⁡n)O(log⁡n)

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(lg⁡n)
— 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.