Hledáš v papírovém slovníku slovo „mrak“. Nečteš ho od první stránky. Otevřeš ho někde uprostřed, uvidíš „lampa“ a víš, že „mrak“ je dál. Zahodíš celou první půlku. Za pár kroků jsi u cíle.
Funguje to jen proto, že slova jsou seřazená. Hledání a třídění patří k nejčastějším úlohám v programování: vyhledávač, e-shop, telefonní kontakty. A u velkých dat rozhoduje, jestli program odpoví za vteřinu, nebo za hodinu.
Hledáme 23 v seřazeném seznamu [2, 5, 8, 12, 16, 23, 38, 56, 72, 91] (indexy 0 až 9).
| Krok | Úsek (indexy) | Prostředek (od + do) // 2 | Hodnota | Rozhodnutí |
|---|---|---|---|---|
| 1 | 0–9 | 4 | 16 | 23 > 16 → vpravo |
| 2 | 5–9 | 7 | 56 | 23 < 56 → vlevo |
| 3 | 5–6 | 5 | 23 | nalezeno |
Stačily 3 porovnání. Lineární vyhledávání by potřebovalo 6.
Podívej se na délky pruhů. Binární vyhledávání v milionu prvků potřebuje jen 20 porovnání, lineární až milion.
Rozhodnutí „vlevo, nebo vpravo“ dává smysl jen tehdy, když vlevo jsou menší a vpravo větší hodnoty.
Učitel má na stole hromádku písemek a chce je seřadit podle abecedy. Jeden bere vždy tu „nejmenší“ a dává ji navrch. Jiný bere jednu po druhé a zasouvá ji na správné místo. Oba dojdou k cíli, ale ne stejně rychle.
Třídicích algoritmů je mnoho. Ve škole se učí jednoduché, na kterých pochopíš princip a složitost, a jeden rychlý, který používají skutečné programy.
[5, 2, 8, 1] → [1, 2, 5, 8]a[i], a[j] = a[j], a[i].[5, 2] → [2, 5]| Algoritmus | Princip | Složitost |
|---|---|---|
| bublinkové (bubble sort) | porovnává sousedy a prohazuje je; největší „probublá“ na konec | O(n²) |
| přímý výběr (selection sort) | najde nejmenší ze zbytku a dá ho na začátek zbytku | O(n²) |
| přímé vkládání (insertion sort) | bere prvky postupně a zasouvá je do už seřazené části | O(n²) |
| slučováním (merge sort) | rozdělí na půlky, seřadí je a slije | O(n log n) |
| rychlé (quicksort) | rozdělí podle pivota na menší a větší | průměrně O(n log n), nejhůř O(n²) |
for i in range(len(a) - 1): for j in range(len(a) - 1 - i): if a[j] > a[j + 1]: a[j], a[j + 1] = a[j + 1], a[j]V praxi nepíšeš třídění sám. Python má sorted(a) a a.sort(), které používají algoritmus Timsort se složitostí O(n log n).
Rozdíl roste s velikostí dat. U malých seznamů ho nepoznáš, u velkých rozhoduje o minutách a dnech.
sorted().