De tijdscomplexiteit van Quicksort, uitgedrukt in Big O-notatie, varieert afhankelijk van de invoergegevens:
* Beste case: O(n logboek n)
* Gemiddeld geval: O(n logboek n)
* In het ergste geval: O(n^2)
Hier is een overzicht:
* Beste case en gemiddelde case (O(n log n)): Dit gebeurt wanneer het bij elke stap gekozen draaielement de array in ongeveer gelijke helften verdeelt. In dit scenario voert het algoritme log n recursieve aanroepen uit (omdat het in feite de omvang van het probleem halveert), en vereist elk recursieniveau O(n)-werk om de array te verdelen. Daarom is de totale tijdscomplexiteit O(n log n).
* In het ergste geval (O(n^2)): Dit gebeurt wanneer het draaielement herhaaldelijk het kleinste of grootste element in de array is. Dit leidt tot zeer ongelijke scheidingswanden. In wezen verklein je, in plaats van de array in tweeën te splitsen, de probleemgrootte elke keer met slechts één element. Dit resulteert in n recursieve oproepen, en elke oproep kost nog steeds O(n) tijd om te verdelen (omdat je bijna alle elementen vergelijkt). Bijgevolg degradeert de totale tijdscomplexiteit tot O(n^2).
Mitigatie van het slechtste scenario:
Het worstcasescenario kan worden verzacht door:
* Gerandomiseerde draaiselectie: Door het draaipunt willekeurig te kiezen, wordt voorkomen dat consequent het kleinste of grootste element wordt gekozen, waardoor het geval O(n^2) veel minder waarschijnlijk wordt.
* Selectie van mediaan van drie draaipunten: Het selecteren van de mediaan van het eerste, middelste en laatste element van de array als draaipunt kan ook helpen consequent slechte draaikeuzes te voorkomen.
In de praktijk is Quicksort vaak zeer efficiënt vanwege de goede prestaties bij gemiddelde gevallen en het feit dat het doorgaans lagere constante factoren heeft dan andere O(n log n) sorteeralgoritmen zoals Merge Sort. Het is echter belangrijk om je bewust te zijn van het potentieel voor O(n^2) worstcasegedrag. |