← 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

jmeno = "barbara"

# vytiskne treti pismeno jmena
print(jmeno[2])

# vypise barbar
print(jmeno[0:6])

# vypise bara
print(jmeno[3:])

# vytiskne baba
print(jmeno[:2] + jmeno[3:5])

# Představme si následující vstup:
# jmeno:adam
# jmeno:barbora
# jmeno:david
# jmeno:emma

# Chceme vypsat jen jména za `jmeno:`

for line in vstup:
  print(vstup[6:])

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

Selection sort

def select_sort(pole):
    nalezene_min = 1

    for i in range(0, len(pole)):
        nalezene_min = i

        # hledame minimum
        for j in range(i + 1, len(pole)):
            # pokud jsme nasli mensi, nez dosud nalezene minimum
            if pole[j] < pole[nalezene_min]:
                # nastavime j jako nove minimum
                nalezene_min = j

        # prohodi pole[i] s pole[nalezene_min]
        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