{{TIN066 Skripta}}
V nesetříděném poli S mám najít k-tý nejmenší prvek (pokud
Quickselect
Quickselect (FIND) funguje na principu QuickSortu. Zvolíme pivot
Složitost záleží na volbě pivota. V nejhorším případě
Median-of-Medians (Blum, BFPRT)
Chtěli bychom zajistit lineární složitost, nezávisející na náhodě. Nepříliš složitá modifikace Quickselectu, jen budeme volit pivota chytřeji (chtěli bychom jako pivota zvolit aspoň přibližný medián).
Uvažujme funkci select(M, k), která najde k-tý nejmenší prvek v M. Medián lze najít zavoláním select(M, ceil(|S|/2)) - hledání mediánu je tedy jen spec. případem hledání k-tého nejmenšího prvku, řešíme tedy obecnější problém.
Idea je simulovat Quickselect, ale vybrat pivota chytřeji, cca medián. Jak na to? Nejdříve si M rozdělíme na pětice a vyrobíme N - pole mediánů pro každou pětici (tedy
Algoritmus zjevně funguje, protože Quickselect funguje pro jakýkoliv výběr pivota. Jelikož námi zvolený pivot je cca medián, quickselectová část běží v
Quickselect se používá častěji než Median-of-Medians, i když má horší složitost v nejhorším případě (paralela: Quicksort se používá častěji, než Heapsort, i když má horší složitost v nejhorším případě).
{{TODO|Důkazy složitostí.}}