Per me ha senso che ciò renda più veloce la risoluzione di un problema se le due metà impiegano meno della metà del lavoro di gestione dell'intero set di dati.
Questa non è l'essenza degli algoritmi di divisione e conquista. Di solito il punto è che gli algoritmi non possono "gestire l'intero set di dati". Invece, è diviso in pezzi che sono banali da risolvere (come l'ordinamento di due numeri), quindi quelli vengono risolti in modo banale e i risultati vengono ricombinati in un modo che fornisce una soluzione per l'intero set di dati.
Ma perché non dividere il set di dati in tre parti? Quattro? n?
Principalmente perché suddividendolo in più di due parti e ricombinando più di due risultati si ottiene un'implementazione più complessa ma non cambia la caratteristica fondamentale (Big O) dell'algoritmo: la differenza è un fattore costante e può causare un rallentamento se la divisione e la ricombinazione di più di 2 sottoinsiemi creano un sovraccarico aggiuntivo.
Ad esempio, se esegui un ordinamento di unione a 3 vie, nella fase di ricombinazione ora devi trovare il più grande dei 3 elementi per ogni elemento, che richiede 2 confronti anziché 1, quindi eseguirai il doppio di tutti i confronti . In cambio, riduci la profondità di ricorsione di un fattore di ln (2) / ln (3) == 0,63, quindi hai il 37% in meno di scambi, ma 2 * 0,63 == 26% in più di confronti (e accessi alla memoria). Che sia buono o cattivo dipende da quale è più costoso nel tuo hardware.
Ho anche visto molti riferimenti a quicksort a 3 vie. Quando è più veloce?
Apparentemente è possibile dimostrare che una variante a doppio perno di quicksort richiede lo stesso numero di confronti ma in media il 20% in meno di swap, quindi è un guadagno netto.
Cosa viene utilizzato in pratica?
Oggi quasi nessuno programma più i propri algoritmi di ordinamento; ne usano uno fornito da una biblioteca. Ad esempio, l' API Java 7 utilizza effettivamente il quicksort dual-pivot.
Le persone che programmano effettivamente il proprio algoritmo di ordinamento per qualche motivo tenderanno ad attenersi alla semplice variante a 2 vie perché un minor potenziale di errori supera il 20% delle prestazioni migliori per la maggior parte del tempo. Ricorda: il miglioramento delle prestazioni di gran lunga più importante è quando il codice passa da "non funzionante" a "funzionante".