← zpět

String slice, algoritmy třídění

Lekce 11

Úlohy

Přestupný rok (3b)

Pascalův trojúhelník (5b)

Pí (7b)

Hledání v souborech (8b)

Sloupcový graf (10b)

Kalendář (10b)

Co jsme dnes probrali

String slice

1jmeno = "barbara"
2
3# vytiskne treti pismeno jmena
4print(jmeno[2])
5
6# vypise barbar
7print(jmeno[0:6])
8
9# vypise bara
10print(jmeno[3:])
11
12# vytiskne baba
13print(jmeno[:2] + jmeno[3:5])
14
15# Představme si následující vstup:
16# jmeno:adam
17# jmeno:barbora
18# jmeno:david
19# jmeno:emma
20
21# Chceme vypsat jen jména za `jmeno:`
22
23for line in vstup:
24 print(vstup[6:])

Třídicí (řadící) algoritmy

Selection sort

1def select_sort(pole):
2 nalezene_min = 1
3
4 for i in range(0, len(pole)):
5 nalezene_min = i
6
7 # hledame minimum
8 for j in range(i + 1, len(pole)):
9 # pokud jsme nasli mensi, nez dosud nalezene minimum
10 if pole[j] < pole[nalezene_min]:
11 # nastavime j jako nove minimum
12 nalezene_min = j
13
14 # prohodi pole[i] s pole[nalezene_min]
15 pole[i], pole[nalezene_min] = pole[nalezene_min], pole[i]

Intermezzo o matematické indukci

Příklad (důkaz časové složitosti SelectSortu):

Algoritmus provede celkem $n + (n-1) + (n-2) + ... + 3 + 2 + 1 = \frac{n(n+1)}{2} \in \mathcal{O}(n^2)$ porovnání.

Tvrzení, které potřebujeme dokázat je:

$$ n + (n-1) + (n-2) + ... + 3 + 2 + 1 = \frac{n(n+1)}{2} $$

Pro $n = 1$:

$$ 1 = \frac{1(1 + 1)}{2} = 1 $$

Levá strana se rovná pravé, tedy pro $n = 1$ platí.

Tvar pro $n = k$ vypadá:

$$ k + (k-1) + (k-2) + ... + 3 + 2 + 1 = \frac{k(k+1)}{2} $$

Nyní provedeme indukční krok $n = k + 1$:

$$ (k + 1) + k + (k-1) + (k-2) + ... + 3 + 2 + 1 = \frac{(k+1)(k+2)}{2} $$

$$ (k + 1) + \frac{k(k+1)}{2} = \frac{(k+1)(k+2)}{2} $$

$$ \frac{k(k+1) + 2(k + 1)}{2} = \frac{(k+1)(k+2)}{2} $$

$$ \frac{(k+1)(k + 2)}{2} = \frac{(k+1)(k+2)}{2} $$

$$ \square $$

Tím jsme tvrzení dokázali indukcí.

Merge sort

Counting sort