6.11
Příklad
Nechť je dán vstup $\{x_1,\, x_2,\, \ldots, x_n \}$.
Vyber náhodně prvek ze seznamu (nazývaný pivot).
Prvky ze seznamu menší než pivot dej do jednoho podseznamu a prvky větší do druhého podseznamu.
Dva kratší seznamy uspořádej podle velikosti.
Vezmi uspořádaný první seznam, za něj dej pivota a připoj uspořádaný druhý seznam.
Algoritmus probíhá rekurentně.
Uspořádání dvouprvkového seznamu je jednoduché.
Označme $T_n$ průměrný počet porovnání pro uspořádání seznamu délky $n$.
Pokud je pivot $r$-tým prvkem seznamu (co do velikosti), pak dostáváme rekurenci18
\begin{equation*}
T_n = n - 1 + T_{r-1} + T_{n-r}, \quad \text{kde klademe} \ T_0 = T_1 = 0.
\end{equation*}
Sečtením těchto vztahů pro $r=1,\, 2,\, \ldots, \, n$:
\begin{equation*}
\sum_{r=1}^n T_n = \sum_{r=1}^n (n-1) + \sum_{r=1}^n \big( T_{r-1} + T_{n-r} \big)
\quad \Longrightarrow \quad n T_n = n(n-1) + 2 \sum_{r=1}^{n-1} T_r.
\end{equation*}
Poslední rovnost vyjádříme pro $k-1$ místo $k$ a oba vztahy odečtěme (zbavíme se tím součtu vpravo), tj.:
\begin{align*}
k T_k &= k(k-1) + 2 \sum_{r=1}^{k-1} T_r, &
(k-1) T_{k-1} &= (k-1)(k-2) + 2 \sum_{r=1}^{k-2} T_r,\end{align*}
a po odečtení:
\begin{equation*}
kT_k - (k-1) T_{k-1} = k(k-1) - (k-1)(k-2) + 2 T_{k-1}.
\end{equation*}
Odvodili jsme tedy vztah (LRR s nekonstantními koeficienty!)
\begin{equation*}
k T_k - (k+1) T_{k-1} = 2k - 2.
\end{equation*}
Vydělením číslem $k(k+1)$ dostáváme
\begin{equation*}
\frac{T_k}{k+1} - \frac{T_{k-1}}{k} = \frac{2k-2}{k(k+1)}.
\end{equation*}
Konečně, sečtením těchto rovností pro $k=1,\, 2, \ldots, n$
\begin{align*}
\frac{T_n}{n+1} &= 2 \sum_{k=1}^n \frac{k-1}{k+1} \cdot \frac{1}{k} \leq 2 \sum_{k=1}^n \frac{1}{k} \leq \\
&\leq 2 \bigg( 1 + \int_1^n \frac{1}{x}\,\mathrm{d} x \bigg) = 2 \big( 1 + \ln(n) \big).\end{align*}
Uzavíráme
\begin{equation*}
T_n = \mathcal{O}\big( n\, \ln(n) \big).
\end{equation*}