====== 7 - Řazení $O(n^2)$ ======
/*
Toto cvičení prochází úpravou, zatím využijte následující zdroje.
{{:courses:a4b33alg:cviceni05upd.pdf| pdf}}, {{:courses:a4b33alg:cviceni8resene.pdf| pdf}}
{{:courses:a4b33alg:cviceni8code.zip| zip}}, {{:courses:b4b33alg:cv8.py| python}}
{{ :courses:b4b33alg:cv_opakovani_3_az_8.pdf | opakovani}}
*/
==== Připomenutí teorie ====
Přednáška 7 v oddíle [[courses:b4b33alg:prednasky|Přednášky]].
=== Selection sort ===
Selection sort probíhá tak, že vždy najdeme nejmenší prvek ve zbytku pole a zaměníme ho za první prvek za seřazenou částí pole.
Výhodu má pro řazení prvků, které vyžadují minimální počet přesunů.
{{ :courses:b4b33alg:cviceni:07_selection_sort.gif?80 |}}
{{ :courses:b4b33alg:cviceni:07_insertion_sort.gif?300|}}
=== Insert(ion) sort ===
Insert sort probíhá tak, že vždy bereme první prvek za seřazenou částí pole a postupně posouváme předchozí prvky, dokud nenajdeme prvek, který je menší (nebo nedojdeme na začátek pole). Prvek umístíme a pokračujeme dále.
Algroritmus sice provede více přesunů než Selection sort, výhodu má ale pro téměř seřazená pole, kdy nemusí dělat tolik porovnání a má tak v ideálním případě lineární složitost.
=== Quick sort ===
{{ :courses:b4b33alg:cviceni:07_quick_sort.gif?300|}}
Quick sort vybere pivota (prvek z pole) a přesune v lineárním průchodu větší prvky doprava a menší doleva. Na těchto dvou částech pole pak rekurzivně provádí to samé, dokud se nedostane k poli s jediným prvkem, které je triviálně uspořádané.
Quick sort má kvadratickou složitost jen v nejhorším případě, pokud máme neustále "smůlu" na pivoty. Jeho očekávaná složitost je $\Theta(n\log(n))$.
=== Srovnání složitostí ===
^ ^ Nejhorší případ ^ Nejlepší případ ^ Průměrný případ ^
|Selection sort | $\Theta(n^2)$ | $\Theta(n^2)$ | $\Theta(n^2)$ |
|Insertion sort | $\Theta(n^2)$ | $\Theta(n)$ | $\Theta(n^2)$ |
|Quicksort | $\Theta(n^2)$ | $\Theta(n\log(n))$ | $\Theta(n\log(n))$ |
Prohlédněte si vizuální animované [[https://www.toptal.com/developers/sorting-algorithms | srovnání různých řadících algoritmů]].
=== Stabilita řazení ===
Řazení je stabilní, pokud prvky se stejnou hodnotou podle které řadíme zůstanou v pořadí v jakém byly v neuspořádaném poli. Toto se hodí v případě, že například máme jména seřazena podle křestních jmen a chceme je seřadit podle přijímení, přičemž chceme zachovat vzájemné uspořádání osob se stejným přijímením.
Insert sort může být stabilní, Selection sort ani Quick sort triviálně ne.
==== Řešené úlohy ====
=== Stabilita ===
**Řešená úloha 1:**
Jak seřadí následující záznamy //podle věku// stabilní řadící algoritmus? Záznamy jsou ve formátu (jméno, věk).
- (Franta, 32)
- (Pepa, 17)
- (Petr, 25)
- (Jana, 23)
- (David, 23)
- (Martina, 25)
- (Lojza, 7)
- (Hanka, 23)
++++ Řešení (rozbalit)|
- (Lojza, 7)
- (Pepa, 17)
- (Jana, 23)
- (David, 23)
- (Hanka, 23)
- (Petr, 25)
- (Martina, 25)
- (Franta, 32)
++++
**Řešená úloha 2:**
Zapište následující prvky do pole tak, aby Selection sort seřadil prvky nestabilně. Prvky řadíme abecedně, dolní index značí jen vzájemné pořadí stejných prvků.
$A, B, C_1, C_2, C_3, D$
++++ Řešení (rozbalit)|
Například $C_1, D, B, C_2, A, C_3$.
++++
-----
**Řešená úloha 3:**
Níže je uveden kód Insert sortu. Představuje stabilní řazení. Jaké změny je v něm nutno provést, aby nadále korektně řadil libovolná data a přitom nebyl stabilní?
int insVal, j
for(int i = 1; i < a.length; i++) {
insVal = a[i];
j = i-1;
while((j >= 0) && (a[j] > insVal)){
a[j+1] = a[j];
j--;
}
a[j+1] = insVal;
}
++++ Řešení (rozbalit)|
V podmínce cyklu ''while'' je potřeba nahradit ostrou nerovnost ''>'' za větší nebo rovno ''>=''.
++++
-----
=== Řazení ===
**Řešená úloha 4:**
Jedenáct prvků řadíme pomocí Insert sortu. Jaký je minimální a maximální možný počet porovnání prvků během tohoto řazení? Jak pole v obou případech vypadají?
++++ Řešení (rozbalit)|
Minimum je 10 (seřazené vzestupně) a maximum je 55 (seřazené sestupně).
++++
-----
**Řešená úloha 5:**
Následující pole se řadí pomocí Quick sortu.
6, 10, 8, 5, 7, 2, 3, 9, 1, 4
Určete, jak bude pole rozděleno na "malé" a "velké" hodnoty po jednom průchodu, pokud jako pivotní hodnotu použijeme:
* 6
* 8
* 4
++++ Řešení (rozbalit)|
* **pro 6:** 4, 1, 3, 5, 2 **|** 7, 8, 9, 10, 6
* **pro 8:** 6, 4, 1, 5, 7, 2, 3 **|** 9, 8, 10
* **pro 4:** 4, 1, 3, 2 **|** 7, 5, 8, 9, 10, 6
++++
-----
**Řešená úloha 6:**
V určitém problému je velikost zpracovávaného pole s daty rovna
$2n^3 \log n$, kde $n$ charakterizuje velikost problému. Pole se řadí pomocí
- Selection sortu
- Insert sortu
- Quick sortu
Jaká je asymptotická složitost jednotlivých algoritmů nad uvedeným
polem?
++++ Řešení (rozbalit)|
$\Theta(n^6 log^2 n)$ pro Selection sort
$\mathrm{O}(n^6 log^2 n)$ pro Insert a Quick sort
Pro Quick sort v průměrném případě dokonce $\Theta(n^3 log^2 n)$.
++++
-----
==== Další úlohy ====
**Úloha 7:**
Jaká posloupnost vznikne, když stabilní řadicí algoritmus seřadí posloupnost $A_2 \; C_2 \; B_2 \; B_1 \; C_1 \; A_1$, v níž platí $A_1 = A_2 < B_1 = B_2 < C_1 = C_2$.
++++Odpověď: |
$A_2 \; A_1 \; B_2 \; B_1 \; C_2 \; C_1$
++++
----
=== Insert sort pro speciální případy ===
**Úloha 8:**
{{ :courses:b4b33alg:cviceni:07_8_array.png?200|}}
Insert sort řadí (do neklesajícího pořadí) pole o $n$ prvcích, kde hodnoty od třetího do posledního prvku rostou a hodnoty prvních dvou prvků jsou stejné a v poli největší.
* Kolik porovnání dvou prvků se provede během tohoto řazení?
* Kolik celkem zápisů do řazeného pole se provede během tohoto řazení?
/*
Počet porovnání: $ 1 + 2 + 3(n-3)$
Počet zápisů: $1 + 3(n - 2)$
*/
----
**Úloha 9:**
{{ :courses:b4b33alg:cviceni:07_9_array.png?200|}}
Insert sort řadí (do neklesajícího pořadí) pole o $n$ prvcích, kde hodnoty prvního a posledního prvku jsou stejné a vyšší než hodnoty ostatních prvků. Ostatní prvky mají rovněž stejnou hodnotu (ale menší než krajní prvky).
* Kolik porovnání dvou prvků se provede během tohoto řazení?
* Kolik celkem zápisů do řazeného pole se provede během tohoto řazení?
/*
Počet porovnání: $2(n - 2)$
Počet zápisů: $2(n - 2)$
*/
----
**Úloha 10:**
Insert sort řadí (do neklesajícího pořadí) pole o $n$ prvcích,
kde v první polovině pole jsou pouze dvojky, ve druhé
polovině jsou jen jedničky.
* Kolik porovnání dvou prvků se provede během tohoto řazení?
* Kolik celkem zápisů do řazeného pole se provede během tohoto řazení?
----
=== Složitost ===
**Úloha 11:**
Pole $n$ různých prvků je uspořádáno od druhého prvku sestupně, první prvek má nejmenší hodnotu ze všech prvků v poli. Vyberte níže všechny možnosti, které alespoň přibližně charakterizují asymptotickou složitost
* Selection sortu
* Insert sortu
* Quick sortu
pracujícího nad tímto konkrétním polem.
a) $O(n)$ \\
b) $\Omega(n)$ \\
c) $\Theta(n)$ \\
d) $O(n^2)$ \\
e) $\Omega(n^2)$ \\
f) $\Theta(n^2)$
----
=== Quick sort extra ===
**Úloha 12:**
Quick sort řadí pole o $n$ prvcích, které nabývají pouze
dvou hodnot, 1 a 2. Jedniček i dvojek je stejně mnoho,
ale jejich poloha není známa. Určete, jaké je jejich \\
**A)** nejvíce příznivé, \\
**B)** nejméně příznivé \\
rozložení v poli.
Pro případ **A)** i **B)** určete asymptotickou složitost tohoto
řazení.
----
**Úloha 13:**
Předpokládejme, že vždy, když Quick sort rozdělí daný
úsek pole na "malé" a "velké" hodnoty, bude jeden z
těchto úseků třikrát delší než ten druhý.
Určete asymptotickou složitost Quick sort-u v tomto
případě.
----