Základy řazení. Karel Richta a kol.

Podobné dokumenty
A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

Algoritmizace prostorových úloh

Hledání k-tého nejmenšího prvku

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

ALG 09. Radix sort (přihrádkové řazení) Counting sort. Přehled asymptotických rychlostí jednotlivých řazení. Ilustrační experiment řazení

NPRG030 Programování I, 2018/19 1 / :03:07

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

IB111 Úvod do programování skrze Python

přirozený algoritmus seřadí prvky 1,3,2,8,9,7 a prvky 4,5,6 nechává Metody řazení se dělí:

Algoritmizace řazení Bubble Sort

Bubble sort. příklad. Shaker sort

Třídění a vyhledávání Searching and sorting

ALG 14. Vícedimenzionální data. Řazení vícedimenzionálních dat. Experimentální porovnání řadících algoritmů na vícedimenzionálních datech

IAJCE Přednáška č. 9. int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) { // nikoli 0 if (Pole[i] > max) {

Sada 1 - Základy programování

Vyvažování a rotace v BVS, všude se předpokládá AVL strom

Algoritmy I, složitost

Úvod do problematiky

Dynamické datové struktury III.

Pokročilé řazení. Karel Richta a kol. Přednášky byly připraveny s pomocí materiálů, které vyrobili Marko Berezovský a Michal Píše

IB111 Úvod do programování skrze Python

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

5. Vyhledávání a řazení 1

Algoritmy I. Třídění ALGI 2010/2011

Rekurze a rychlé třídění

Techniky návrhu algoritmů

Složitost UPR 2008/09 1

Časová složitost algoritmů

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

Stromy, haldy, prioritní fronty

Třídící algoritmy. Insert Sort. Bubble Sort. Select Sort. Shell Sort. Quick Sort. Merge Sort. Heap Sort.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Principy indukce a rekursivní algoritmy

ˇ razen ı rychlejˇ s ı neˇ z kvadratick e Karel Hor ak, Petr Ryˇsav y 20. dubna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Řazení. Uspořádat množinu prvků obsahujících klíč podle definovaného kriteria.

Základní datové struktury III: Stromy, haldy

3 Algoritmy řazení. prvku a 1 je rovněž seřazená.

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání

Matematická indukce a správnost programů. Základy diskrétní matematiky, BI-ZDM ZS 2011/12, Lekce 13

TGH07 - Chytré stromové datové struktury

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

Maturitní téma: Programovací jazyk JAVA

bin arn ı vyhled av an ı a bst Karel Hor ak, Petr Ryˇsav y 23. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

Pole a kolekce. v C#, Javě a C++

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Třídění dat. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_26 04

Složitost algoritmů. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Časová složitost algoritmů, řazení a vyhledávání

IB111 Úvod do programování 1 / 62

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Základy algoritmizace a programování

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

Datové struktury 2: Rozptylovací tabulky

Šablony, kontejnery a iterátory

Pokročilé haldy. prof. Ing. Pavel Tvrdík CSc. Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010

TGH07 - Chytré stromové datové struktury

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Algoritmy vyhledávání a řazení. Zatím nad lineární datovou strukturou (polem)

Na začátku rozdělíme práci a určíme, které podproblémy je potřeba vyřešit. Tyto

Rekurzivní algoritmy

Dynamické datové struktury IV.

R zné algoritmy mají r znou složitost

Zadání k 2. programovacímu testu

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY

Prohledávání do šířky = algoritmus vlny

Algoritmizace a programování

Dijkstrův algoritmus

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Elegantní algoritmus pro konstrukci sufixových polí

Prioritní fronta, halda

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

2. lekce Algoritmus, cyklus Miroslav Jílek

Různé algoritmy mají různou složitost

IB002 Algoritmy a datové struktury I

13. Třídící algoritmy a násobení matic

Zpracoval: 7. Matematická indukce a rekurse. Řešení rekurentních (diferenčních) rovnic s konstantními koeficienty.

Základy algoritmizace. Hašování

IB111 Základy programování Radek Pelánek 1 / 61

Dynamické programování. Optimální binární vyhledávací strom

Binární vyhledávací stromy pokročilé partie

SORT STABILITY

5 Rekurze a zásobník. Rekurzivní volání metody

ALGORITMY A DATOVÉ STRUKTURY

Úvod do programování - Java. Cvičení č.4

Digitální učební materiál

Rekurentní rovnice, strukturální indukce

Anotace. pointery (pars prima). Martin Pergel,

TGH05 - aplikace DFS, průchod do šířky

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

TGH05 - aplikace DFS, průchod do šířky

Amortizovaná složitost. Prioritní fronty, haldy (binární, d- regulární, binomiální, Fibonacciho), operace nad nimi a jejich složitost

Adresní vyhledávání (přímý přístup, zřetězené a otevřené rozptylování, rozptylovací funkce)

Stanovisko Rady STM k předmětu DSA

a) b) c) Radek Mařík

Michal Krátký. Úvod do programování. Cíl kurzu. Podmínky získání zápočtu III/III

8. Rekurze. doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Vzdálenost uzlů v neorientovaném grafu

Stromy. Jan Hnilica Počítačové modelování 14

Transkript:

Základy řazení Karel Richta a kol. Přednášky byly připraveny s pomocí materiálů, které vyrobili Marko Berezovský, Petr Felkel, Josef Kolář, Michal Píše a Pavel Tvrdík Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol., 2018 Datové struktury a algoritmy, B6B36DSA 01/2018, Lekce 4 https://cw.fel.cvut.cz/wiki/courses/b6b36dsa/start B6B36DSA, 2018, Lekce 4, 1/59

Definice problému řazení Mějme parciálně uspořádanou množinu (poset) M, kde uspořádání je binární relace M M, která je reflexivní, tranzitivní a antisymetrická. Definice problému řazení: Na vstupu je posloupnost prvků z M; cílem je najít takovou posloupnost prvků z M, pro kterou platí dvě základní kritéria: výstupní posloupnost je seřazená a výstupní posloupnost je permutací původní posloupnosti (obsahuje tedy stejná data, jen v jiném pořadí). Z hlediska řazení se vstupní data často chápou jako soubor dvojic klíč hodnota, přičemž po seřazení je posloupnost klíčů monotónní, zatímco na připojené hodnoty se při řazení nebere zřetel. Při existenci několika položek se stejným klíčem se však podle pořadí odpovídajících hodnot rozlišují stabilní a nestabilní algoritmy. V definici relace uspořádání se přitom bere ohled pouze na klíče příslušných hodnot. B6B36DSA, 2018, Lekce 4, 2/59

B6B36DSA, 2018, Lekce 4, 3/59

B6B36DSA, 2018, Lekce 4, 4/59

Základní taxonomie řazení Řazení bez využití porovnání (adresní řazení: radix-sort, bucket-sort) Řazení využívající porovnání (asociativní řazení): Nevyvážené dělení řazené posloupnosti: Důraz na analýzu (řazení přímým výběrem: selection sort) Důraz na syntézu (řazení přímým zatřiďováním: insertion-sort) Vyvážené dělení řazené posloupnosti: Důraz na analýzu (řazení dělením: quick-sort) Důraz na syntézu (řazení slučováním: merge-sort) B6B36DSA, 2018, Lekce 4, 5/59

Cvičení Navrhněte a popište algoritmus pro seřazení balíčku karet. Smíte používat jen jednu ruku a v ní smíte držet vždy nanejvýš jednu kartu. Během řazení můžete (a musíte) odkládat karty do několika pomocných balíčků. Z každého balíčku je vidět a je známa pouze hodnota vrchní karty. Úkolem je sestavit algoritmus tak, aby využíval co nejmenšího počtu pomocných balíčků. B6B36DSA, 2018, Lekce 4, 6/59

SELECTION-SORT řazení přímým výběrem B6B36DSA, 2018, Lekce 4, 7/59

SELECTION-SORT Start T O U B J R M A K D Z E min Krok 1 T O U B J R M A K D Z E A O U B J R M T K D Z E B6B36DSA, 2018, Lekce 4, 8/59

SELECTION-SORT min Krok 2 A O U B J R M T K D Z E A B U O J R M T K D Z E min Krok 3 A B U O J R M T K D Z E A B D O J R M T K U Z E B6B36DSA, 2018, Lekce 4, 9/59

SELECTION-SORT... min Krok k A B D E J K M T R U Z O A B D E J K M O R U Z T... k seřazeno A B D E J K M O R T U Z B6B36DSA, 2018, Lekce 4, 10/59

Pseudokód pro SELECTION-SORT Algoritmus udržuje invariant, že na začátku každé iterace ve vnější smyčce pro j obsahuje podpole A[1..j-1] j-1 nejmenších elementů v poli A[1..n] a tyto elementy jsou seřazeny podle velikosti. Po prvých n-1 krocích podpole A[1..n-1] obsahuje n-1 seřazených elementů. Proto element A[n] musí být největší element. B6B36DSA, 2018, Lekce 4, 11/59

for (j = 0; j < n-1; j++) { // select min smalest = j; for (i = j+1; i < n; i++) { if (a[i] < a[smalest]) { smalest = i; } } // exchange min min = a[smalest]; a[smalest] = a[j]; a[j] = min; } B6B36DSA, 2018, Lekce 4, 12/59

Platí požadovaný invariant? for (j = 0; j < n-1; j++) { // tady musí platit, že začátek do j-1 je seřazen smalest = j; for (i = j+1; i < n; i++) { if (a[i] < a[smalest]) { smalest = i; } } min = a[smalest]; a[smalest] = a[j]; a[j] = min; } Pro n=1 to zřejmě platí (triviálně). Předpokládejme platnost pro 1 k n a dokažme indukcí platnost pro k+1. Pomůcka: A B D E J K M T R U Z O j se nemění a[j] >= a[j-1] k j n-k min B6B36DSA, 2018, Lekce 4, 13/59

Platí požadovaný invariant? for (j = 0; j < n-1; j++) { } // tady musí platit, že začátek do j-1 je seřazen smalest = j; for (i = j+1; i < n; i++) { } if (a[i] < a[smalest]) { smalest = i; } min = a[smalest]; a[smalest] = a[j]; a[j] = min; Pro n=1 to zřejmě platí (triviálně). Předpokládejme platnost pro 1 k n a dokažme indukcí platnost pro k+1. Pomůcka: j se nemění a[j] >= a[j-1] A B D E J K M O R U Z T k j n-k B6B36DSA, 2018, Lekce 4, 14/59

SELECTION-SORT n min Krok k A B D E J K M T R U Z O k n-k Výběr minima. (n-k) testů Celkem testů n 1 (n k) n 1 n n 1 k n(n 1) n(n 1) k 1 k 1 k 1 2 1 (n 2 n) 2 B6B36DSA, 2018, Lekce 4, 15/59

SELECTION-SORT Krok k A B D E J K M T R U Z O k n-k přesuny. 3 Celkem přesunů n 1 3 3(n - 1) k 1 B6B36DSA, 2018, Lekce 4, 16/59

SELECTION-SORT Shrnutí Celkem testů 1 2 (n 2 n) = (n 2 ) Celkem přesunů 3(n - 1) = (n) Celkem operací 1 2 (n n) + 3(n - 1) = (n 2 ) 2 Asymptotická složitost SELECTION-SORT je (n 2 ) B6B36DSA, 2018, Lekce 4, 17/59

INSERTION-SORT řazení přímým vkládáním B6B36DSA, 2018, Lekce 4, 18/59

INSERTION-SORT Start T O B K U R M A J D Z E Krok 1 T O B K U R M A J D Z E O T B K U R M A J D Z E B6B36DSA, 2018, Lekce 4, 19/59

INSERTION-SORT Krok 2 O T B K U R M A J D Z E B O T K U R M A J D Z E Krok 3 B O T K U R M A J D Z E B K O T U R M A J D Z E B6B36DSA, 2018, Lekce 4, 20/59

INSERTION-SORT... Krok k B K O R T U M A J D Z E B K M O R T U A J D Z E k... seřazeno A B D E J K M O R T U Z B6B36DSA, 2018, Lekce 4, 21/59

INSERTION-SORT for (j = 1; j < n; j++) { // find & make // place for a[j] insval = a[j]; i = j-1; while ((i >= 0) && (a[i] > insval)) { a[i+1] = a[i]; i--; } // insert a[j] a[i+1] = insval; } B6B36DSA, 2018, Lekce 4, 22/59

Korektnost algoritmu INSERTION-SORT Abychom zjistili, že algoritmus vždy dává korektní výsledky, zpravidla dokazujeme invariant algoritmu. Invariant pro INSERTION-SORT: Na začátku každé vnější iterace pro j obsahuje podpole A[1..j-1] j-1 nejmenších elementů v poli A[1..n] a tyto elementy jsou seřazeny podle velikosti. Musíme dokázat 3 věci: Počáteční krok (initialization): Invariant platí před první iterací. Indukční krok (maintenance): Pokud invariant platí před iterací, zůstane v platnosti i po iteraci (před další iterací). Terminace: Algoritmus musí po konečném počtu iterací skončit. Tyto vlastnosti zajistí, že algoritmus je korektní. B6B36DSA, 2018, Lekce 4, 23/59

Korektnost INSERTION-SORT Počáteční krok (initialization): před první iterací je j = 1. Proto podpole o jednom prvku a[0] je triviálně seřazeno. Indukční krok (maintenance): V podstatě se jedná o invariant vnitřního cyklu (while). Předpoklad je, že a[0..j-1] je seřazeno. Vybraný prvek a[j] je zatříděn do tohoto úseku před nejblíže větší prvek. Zřejmě tedy bude po jeho vložení seřazen i úsek a[0..j]. Terminace: Vnější cyklus skončí, když j n, tj. j = n. Navíc je úsek a[0..n] seřazen vzestupně. B6B36DSA, 2018, Lekce 4, 24/59

INSERTION-SORT Krok k M B K O R T U A J D Z E k testů + 1 = přesunů testů. 1 nejlepší případ k nejhorší případ (k+1)/2 průměrný případ přesunů. 2 nejlepší případ k+1 nejhorší případ (k+3)/2 průměrný případ B6B36DSA, 2018, Lekce 4, 25/59

INSERTION-SORT Shrnutí Celkem testů n 1 = (n) nejlepší případ (n 2 n)/2 = (n 2 ) nejhorší případ (n 2 + n 2)/4 = (n 2 ) průměrný případ Celkem přesunů 2n 2 = (n) (n 2 + n 2)/2 = (n 2 ) nejlepší případ nejhorší případ (n 2 + 5n 6)/4 = (n 2 ) průměrný případ Asymptotická složitost INSERTION-SORT je O(n 2 ) (!!) B6B36DSA, 2018, Lekce 4, 26/59

BUBBLE-SORT bublinkové řazení B6B36DSA, 2018, Lekce 4, 27/59

BUBBLE-SORT Start T O B U J R M A K D Z E Fáze 1 T O B U J R M A K D Z E O T B U J R M A K D Z E O B T U J R M A K D Z E B6B36DSA, 2018, Lekce 4, 28/59

BUBBLE-SORT Fáze 1 O B T U J R M A K D Z E etc O B T J R M A K D U Z E Fáze 2 O B T J R M A K D U E Z B6B36DSA, 2018, Lekce 4, 29/59

BUBBLE-SORT Fáze 2 B O T J R M A K D U E Z etc B O J R M A K D T U E Z Fáze 3 B O J R M A K D T E U Z B6B36DSA, 2018, Lekce 4, 30/59

BUBBLE-SORT Fáze 3 atd B J O M A K D R T E U Z... Fáze n-1 A B D E J K M O R T U Z n-2 seřazeno A B D E J K M O R T U Z B6B36DSA, 2018, Lekce 4, 31/59

BUBBLE-SORT for (lastpos = n-1; lastpos > 0; lastpos--) for (j = 0; j < lastpos; j++) if (a[j] > a[j+1]) swap(a, j, j+1); Shrnutí Celkem testů (n-1) + (n-2) + + 2 + 1 = 1 2 (n 2 n) = (n 2 ) Celkem přesunů 1 2 (n 2 n) 0 = (1) = (n 2 ) nejlepší případ nejhorší případ Asymptotická složitost BUBBLE-SORT je (n 2 ) B6B36DSA, 2018, Lekce 4, 32/59

SHELL-SORT řazení se snižujícím se příspěvkem B6B36DSA, 2018, Lekce 4, 33/59

Řazení metodou SHELLSORT SHELLSORT nebo též řazení se snižujícím se přírůstkem je řadicí algoritmus založený na principu bublinkového vkládání, který objevil a v roce 1959 publikoval Donald Shell. V několika průchodech se řadí prvky od sebe stejně vzdálené pomocí bublinkového vkládání. Vzdálenost prvků od sebe (krok) se pak postupně snižuje, až je rovna jedné, tj. klasický BUBBLESORT. Bublinkové řazení porovnává a vyměňuje sousední prvky. SHELLSORT se snaží nejprve vyměnit prvky vzdálenější a teprve poté prvky bližší. Vzdálené prvky pak nemusí probublávat celým polem. Praktický problém je stanovení délky kroku. B6B36DSA, 2018, Lekce 4, 34/59

Implementace v Javě public static void shellsort(int[] a) { for (int krok = a.length / 2; krok > 0; krok = (krok == 2? 1 : (int)math.round(krok / 2.2))) { for (int i = krok; i < a.length; i++) { int temp = a[i]; for (int j = i; j >= krok && a[j - krok] > temp; j -= krok) { a[j] = a[j - krok]; // prohoď prvky v nesprávném a[j - krok] = temp; // pořadí } } } } B6B36DSA, 2018, Lekce 4, 35/59

Složitost SHELLSORT Teoretické analýzy nenašly nejvhodnější řadu snižujících se kroků. Kerninghan a Ritchie ve své implementaci používali krok n/2, který pak postupně dělili dvěma. Zde je použita úprava kroku koeficientem 2.2 podle Marcina Ciury, což se zdá vést k nejlepším výsledkům. SHELLSORT je nestabilní řadicí metoda (tj. nezachovává původní pořadí dvou prvků se stejným klíčem. Časová složitost metody SHELLSORT je přibližně rovna n 3/2. Tím se zdá být nejlepší v kategorii metod složitosti (n 2 ). B6B36DSA, 2018, Lekce 4, 36/59

QUICK-SORT Sir Charles Antony Richard Hoare C. A. R. Hoare: Quicksort. Computer Journal, Vol. 5, 1, 10-15 (1962) B6B36DSA, 2018, Lekce 4, 37/59

Rozděl a Panuj! Divide & Conquer! Divide et Impera! úloha Rozděl! "jejich" práce naše práce úloha úloha úloha Vyřeš částečnou úlohu Vyřeš částečnou úlohu řešení Sluč! řešení Sluč! řešení B6B36DSA, 2018, Lekce 4, 38/59

QUICK-SORT Myšlenka Divide & Conquer! Start M A K D R B T O J U Z E Malá Velká M A K D R B T O J U Z Rozděl! E E A K D J B T O R U Z M Malá Velká B6B36DSA, 2018, Lekce 4, 39/59

QUICK-SORT Dvě samostatné úlohy E A K D J Rozděl! B T O R U Z M Rozděl! B A D K J E M O R U Z T Čtyři samostatné úlohy Rozděluj! B A D K J E Rozděl! Rozděl! M O R U Z T Rozděl! atd atd atd atd Rozděl! B6B36DSA, 2018, Lekce 4, 40/59

QUICK-SORT A B D E J K M O R T U Z Opanováno! B6B36DSA, 2018, Lekce 4, 41/59

QUICK-SORT Dělení pivot pivot Init Pivot M il ir M A K D R B T O J U Z E B6B36DSA, 2018, Lekce 4, 42/59

QUICK-SORT Dělení Krok 1 Pivot il ir M M A K D R B T O J U Z E il ir E A K D R B T O J U Z M B6B36DSA, 2018, Lekce 4, 43/59

QUICK-SORT Dělení Krok 2 Pivot M il ir E A K D R B T O J U Z M il ir E A K D J B T O R U Z M B6B36DSA, 2018, Lekce 4, 44/59

QUICK-SORT Dělení Pivot ir il M Krok 3 E A K D J B T O R U Z M ir il Stop Rozděl! Init Pivot E il ir E A K D J B T O R U Z M B6B36DSA, 2018, Lekce 4, 45/59

QUICK-SORT Dělení Krok 1 Pivot E il ir E A K D J B T O R U Z M il ir B A K D J E T O R U Z M B6B36DSA, 2018, Lekce 4, 46/59

QUICK-SORT Dělení Pivot E B il ir A K D J E T O R U Z M Krok 2 ir il ir il Stop B A D K J E T O R U Z M Rozděl! Init Pivot B B il ir A D K J E T O R U Z M B6B36DSA, 2018, Lekce 4, 47/59

QUICK-SORT Dělení Krok 1 Pivot B B il ir A D K J E T O R U Z M il ir ir il Stop Rozděl! Init Pivot B A B D K J E T O R U Z M il ir A B D K J E T O R U Z M B6B36DSA, 2018, Lekce 4, 48/59

QUICK-SORT Dělení Krok 1 Pivot B il == ir ir il viz kód... A B D K J E T O R U Z M Další oddíl Init Pivot K A B il ir D K J E T O R U Z M atd atd B6B36DSA, 2018, Lekce 4, 49/59

QUICK-SORT void qsort(item a[], int low, int high) { int il = low, ir = high; Item pivot = a[low]; do { while (a[il] < pivot) il++; while (a[ir] > pivot) ir--; if (il < ir) { swap(a,il, ir); il++; ir--; } else if (il == ir) { il++; ir--;} } while( il <= ir); K il il K D ir K ir K K D U D K } if (low < ir) qsort(a, low, ir); if (il < high) qsort(a, il, high); Rozděl! B6B36DSA, 2018, Lekce 4, 50/59

QUICK-SORT Levý index se nastaví na začátek zpracovávaného úseku pole, pravý na jeho konec, zvolí se pivot. Cyklus (rozdělení na malé" a velké") : Levý index se pohybuje doprava a zastaví se na prvku vetším nebo rovném pivotovi. Pravý index se pohybuje doleva a zastaví se na prvku menším nebo rovném pivotovi. Pokud je levý index ještě před pravým, příslušné prvky se prohodí, a oba indexy se posunou o 1 ve svém směru. Jinak pokud se indexy rovnají, jen se oba posunou o 1 ve svém směru. Cyklus se opakuje, dokud se indexy neprekříží, tj. pravý se dostane pred levého. Následuje rekurzivní volání (zpracování malých" a velkých" zvlášť) na úsek od začátku do pravého(!) indexu včetně a na úsek od levého(!) indexu včetně až do konce, má-li príslušný úsek délku větší než 1. B6B36DSA, 2018, Lekce 4, 51/59

QUICK-SORT Asymptotická složitost Celkem přesunů a testů (n log 2 (n)) (n log 2 (n)) (n 2 ) nejlepší případ průměrný případ nejhorší případ Asymptotická složitost QUICK-SORT je O(n 2 ),... ale! : Očekávaná složitost QUICK-SORT je (n log 2 (n)) (!!) B6B36DSA, 2018, Lekce 4, 52/59

Varianta QUICK-SORT Jedno rekurzivní volání v QUICK-SORT lze nahradit iterací (tailrecursion): B6B36DSA, 2018, Lekce 4, 53/59

Porovnání efektivity řazení N N 2 N log 2 (N) 1 1 0 10 100 33.2 3.0 100 10 000 6 64.4 15.1 1 000 1 000 000 9 965.8 100.3 10 000 100 000 000 132 877.1 752.6 100 000 10 000 000 000 1 660 964.0 6 020.6 1 000 000 1 000 000 000 000 19 931 568.5 50 171.7 10 000 000 100 000 000 000 000 232 534 966.6 430 042.9 N 2 N log 2 (N) zpomalení (1~1sec) 3 sec 15 sec 1.5 min 13 min 1.5 hod 14 hod 5 dnů B6B36DSA, 2018, Lekce 4, 54/59

Stabilita řazení Stabilní řazení nemění pořadí prvků se stejnou hodnotou. Neseřazená data Hodnoty X i jsou totožné X b X c X a Seřazená data Seřaď X b X c X a B6B36DSA, 2018, Lekce 4, 55/59

Stabilní řazení záznam: Jméno Příjmení Vstup: seznam seřazen pouze podle jména Výstup: seznam seřazen podle jména i příjmení Andrew Andrew Andrew Barbara Barbara Barbara Charles Charles Charles Cook Amundsen Brown Cook Brown Amundsen Amundsen Cook Brown stabilní řazení seřaď záznamy pouze podle příjmení Andrew Barbara Charles Andrew Barbara Charles Andrew Barbara Charles Amundsen Amundsen Amundsen Brown Brown Brown Cook Cook Cook Pořadí záznamů se stejným příjmením se nezměnilo B6B36DSA, 2018, Lekce 4, 56/59

Nestabilní řazení záznam: Jméno Příjmení Vstup: seznam seřazen pouze podle jména Výstup: původní pořadí jmen je ztraceno seřazeno Andrew Andrew Andrew Barbara Barbara Barbara Charles Charles Charles Cook Amundsen Brown Cook Brown Amundsen Amundsen Cook Brown QuickSort seřaď záznamy pouze podle příjmení Barbara Andrew Charles Barbara Charles Andrew Charles Andrew Barbara Amundsen Amundsen Amundsen Brown Brown Brown Cook Cook Cook Pořadí záznamů se stejným příjmením se změnilo B6B36DSA, 2018, Lekce 4, 57/59

Stabilita někdy závisí na implementaci B 1 D 1 C 1 A 1 C 2 B 2 A 2 D 2 B 3 A 3 D 3 C 3 Insert Bubble -- Stabilní implementace A 1 A 2 A 3 B 1 B 2 B 3 C 1 C 2 C 3 D 1 D 2 D 3 B 1 D 1 C 1 A 1 C 2 B 2 A 2 D 2 B 3 A 3 D 3 C 3 Insert Bubble -- Nestabilní implementace QuickSort Select Sort Vždy nestabilní!! A 2 A 1 A 3 B 2 B 3 B 1 C 3 C 1 C 2 D 3 D 2 D 1 B6B36DSA, 2018, Lekce 4, 58/59

The End B6B36DSA, 2018, Lekce 4, 59/59