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*}