ALG 07 Selection sort (Select sort) Insertion sort (Insert sort) A4B33ALG 2010/05 ALG 07 Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated Quicksort Stabilita řazení 1
Selection sort T O U B J R M A K D Z E A T O U B J R M K D Z E A O U B A4B33ALG 2010/06 Selection sort Neseřazeno Seřazeno T O U B J R M A K D Z E Start min A T O U B J R M K D Z E Krok1 A O U B J R M T K D Z E 2
Selection sort B A O U J R M T K D Z E A B U O J R M T K D Z E D A B U A4B33ALG 2010/06 Selection sort min B Krok 2 A O U J R M T K D Z E A B U O J R M T K D Z E min Krok 3 D A B U O J R M T K Z E A B D O J R M T K U Z E 3
. . . . . . . . . . . . Selection sort O A B D E J K M T R U Z A B D E A4B33ALG 2010/06 Selection sort . . . . . . min Krok k O A B D E J K M T R U Z 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 4
for (i = 0; i < n-1; i++) { // select min jmin = i; A4B33ALG 2010/06 Selection sort for (i = 0; i < n-1; i++) { // select min jmin = i; for (j = i+1; j < n; j++) if (a[j] < a[jmin]) jmin = j; // put min min = a[jmin]; a[jmin] = a[i]; a[i] = min; } 5
Algoritmus a program není totéž A4B33ALG 2010/06 Selection sort n Krok k min O A B D E J K M T R U Z k n-k Výběr minima ……. (n-k) testů Celkem testů 6 Algoritmus a program není totéž
Selection sort O A B D E J K M T R U Z n-k k A4B33ALG 2010/06 Selection sort Krok k O A B D E J K M T R U Z n-k k přesuny ……. 3 Celkem přesunů 7
Asymptotická složitost Selection Sortu je (n2) A4B33ALG 2010/06 Selection sort Shrnutí Celkem testů = (n2) Celkem přesunů = (n) Celkem operací + = (n2) Asymptotická složitost Selection Sortu je (n2) 8
Insertion sort T O B K U R M A J D Z E O B K U R M A J D Z E T O T B K A4B33ALG 2010/06 Insertion sort Start T O B K U R M A J D Z E O Krok1 B K U R M A J D Z E T O T B K U R M A J D Z E 9
Insertion sort B K U R M A J D Z E O T B O T K U R M A J D Z E K B U R A4B33ALG 2010/06 Insertion sort B Krok 2 K U R M A J D Z E O T B O T K U R M A J D Z E K Krok 3 B U R M A J D Z E O T B K O T U R M A J D Z E 10
. . . . . . . . . . . . Insertion sort M B K A J D Z E O R T U B K M O A4B33ALG 2010/06 Insertion sort . . . . . . Krok k M B K A J D Z E O R T U 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 11
while ((j >= 0) && (a[j] > insVal)) { a[j+1] = a[j]; j--; } A4B33ALG 2010/06 Insertion sort for (i = 1; i < n; i++) { // find & make // place for a[i] insVal = a[i]; j = i-1; while ((j >= 0) && (a[j] > insVal)) { a[j+1] = a[j]; j--; } // insert a[i] a[j+1] = insVal; 12
Insertion sort M B K O R T U A J D Z E k A4B33ALG 2010/06 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 13
Asymptotická složitost Insertion Sortu je O(n2) (!!) A4B33ALG 2010/06 Insertion sort Shrnutí Celkem testů n − 1 = (n) nejlepší případ (n2 − n)/2 = (n2) nejhorší případ (n2 + n − 2)/4 = (n2) průměrný případ Celkem přesunů 2n − 2 = (n) nejlepší případ (n2 + n − 2)/2 = (n2) nejhorší případ (n2 + 5n − 6)/4 = (n2) průměrný případ Asymptotická složitost Insertion Sortu je O(n2) (!!) 14
Bubble sort T O B U J R M A K D Z E T O B U J R M A K D Z E O T B U J A4B33ALG 2010/06 Bubble sort T O B U J R M A K D Z E Start 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 15
Bubble sort 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 O A4B33ALG 2010/06 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 16
Bubble sort 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 B A4B33ALG 2010/06 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 17
. . . . . . Bubble sort … atd … B J O M A K D R T E U Z A B D E J K M A4B33ALG 2010/06 Bubble sort Fáze 3 … atd … B J O M A K D R T E U Z . . . . . . A B D E J K M O R T U Z Fáze n-1 n-2 Seřazeno A B D E J K M O R T U Z 18
for (lastPos = n-1; lastPos > 0; lastPos--) A4B33ALG 2010/06 Insertion 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 = = (n2) 0 = (1) nejlepší případ Celkem přesunů = (n2) nejhorší případ Asymptotická složitost Bubble Sortu je (n2) 19
Sir Charles Antony Richard Hoare A4B33ALG 2010/06 Quicksort Sir Charles Antony Richard Hoare C. A. R. Hoare: Quicksort. Computer Journal, Vol. 5, 1, 10-15 (1962) 20
Rozděl a panuj! Divide and conquer! Divide et impera! A4B33ALG 2010/06 Rozděl a panuj! Divide and conquer! Divide et impera! "jejich" práce úloha naše práce Rozděl! úloha Rozděl! úloha úloha Vyřeš částečnou úlohu Vyřeš částečnou úlohu Sluč! Sluč! řešení řešení řešení 21
Quicksort Divide & Conquer! M A K D R B T O J U Z E Malá M A K D R B T A4B33ALG 2010/06 Quicksort Myšlenka Divide & Conquer! Start M A K D R B T O J U Z E Malá M A K D R B T O J U Z E Velká Rozděl! E A K D J B T O R U Z M Malá Velká 22
… … … … … … … … . . . Quicksort E A K D J B T O R U Z M B A D K J E M A4B33ALG 2010/06 Quicksort Dvě samostatné úlohy E A K D J B T O R U Z M Rozděl! Rozděl! B A D K J E M O R U Z T Čtyři samostatné úlohy B A D K J E M O R U Z T Rozděl! Rozděl! Rozděl! Rozděl! atd… atd… atd… atd… Rozděluj! . . . … … … … … … … … 23
… … … … … … … … … … … … … … … … … Quicksort A B D E J K M O R T U Z A4B33ALG 2010/06 Quicksort … … … … … … … … … … … … … … … … … A B D E J K M O R T U Z Opanováno! 24
Quicksort Dělení pivot … … … … iL iR M M A K D R B T O J U Z E A4B33ALG 2010/06 Quicksort Dělení pivot Pivot … … … … Pivot iL Init iR M M A K D R B T O J U Z E 25
Quicksort Dělení 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 A4B33ALG 2010/06 Quicksort Dělení iL iR Pivot M M A K D R B T O J U Z E Krok 1 iL iR E A K D R B T O J U Z M 26
Quicksort Dělení iL iR M E A K D R B T O J U Z M iL iR E A K D J B T O A4B33ALG 2010/06 Quicksort Dělení iL Pivot iR M Krok 2 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 27
Quicksort Dělení iL iR M E A K D J B T O R U Z M iR iL Stop Rozděl! A4B33ALG 2010/06 Quicksort Dělení iL Pivot iR M Krok 3 E A K D J B T O R U Z M iR iL Stop Rozděl! iL Pivot iR E Init E A K D J B T O R U Z M 28
Quicksort Dělení iL iR E E A K D J B T O R U Z M iL iR B A K D J E T O A4B33ALG 2010/06 Quicksort Dělení iL Pivot iR E Krok 1 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 29
Quicksort Dělení iL iR E B A K D J E T O R U Z M iL iR iL Stop iR B A4B33ALG 2010/06 Quicksort Dělení iL iR Pivot E B A K D J E T O R U Z M Krok 2 iL iR iL Stop iR B A D K J E T O R U Z M Rozděl! iL Pivot iR Init B B A D K J E T O R U Z M 30
Quicksort Dělení iL iR B B A D K J E T O R U Z M iL iR iL iR Stop A A4B33ALG 2010/06 Quicksort Dělení iL iR Pivot B B A D K J E T O R U Z M Krok 1 iL iR iL iR Stop A B D K J E T O R U Z M Rozděl! iL Pivot iR B Init A B D K J E T O R U Z M 31
== Quicksort Dělení iL iR iL viz kód... iR B A B D K J E T O R U Z M A4B33ALG 2010/06 Quicksort Dělení iL Pivot iR == iL viz kód... iR Krok 1 B A B D K J E T O R U Z M Další oddíl iL iR Pivot K A B D K J E T O R U Z M Init atd... atd… 32
Quicksort iL iR K K D K iL iR K K D U D K Rozděl! A4B33ALG 2010/06 Quicksort 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); if (low < iR) qSort(a, low, iR); if (iL < high) qSort(a, iL, high); iL iR K K D K iL iR K K D U D K Rozděl! 33
Cyklus (rozdělení na „malé" a „velké") : A4B33ALG 2010/06 Quicksort 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. 34
Asymptotická složitost A4B33ALG 2010/06 Quicksort Asymptotická složitost Celkem přesunů a testů (n·log2(n)) nejlepší případ (n·log2(n)) průměrný případ nejhorší případ (n2) Asymptotická složitost Quick Sortu je O(n2), ... … ale! : “Očekávaná” složitost Quick Sortu je (n·log2(n)) (!!) 35
Porovnání efektivity Quicksort N N2 N log2(N) 1 10 100 33.2 3.0 A4B33ALG 2010/06 Quicksort Porovnání efektivity zpoma- lení (1~1sec) N2 N N2 N log2(N) N log2(N) 1 10 100 33.2 3.0 10 000 6 64.4 15.1 1 000 1 000 000 9 965.8 100.3 100 000 000 132 877.1 752.6 100 000 10 000 000 000 1 660 964.0 6 020.6 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 3 sec 15 sec 1.5 min 13 min 1.5 hod 14 hod 5 dnů tab. 1 36
Quicksort 8 5 12 6 10 11 2 4 1 3 7 9 Ukázka průběhu pivot = = první A4B33ALG 2010/06 Quicksort 8 5 12 6 10 11 2 4 1 3 7 9 Ukázka průběhu pivot = = první v úseku 7 5 3 6 1 4 2 11 10 12 8 9 2 5 3 6 1 4 7 9 10 8 12 11 1 5 3 6 2 4 8 10 9 11 12 4 3 2 6 5 9 10 2 3 4 5 6 2 3 37
A4B33ALG 2010/06 Quicksort 1 2 3 4 5 6 7 8 9 10 11 12 7 5 3 6 1 4 2 9 8 12 10 11 2 5 3 6 1 4 7 9 10 8 11 12 1 2 4 5 3 6 8 9 10 4 3 2 5 6 Schéma rekurzivního volání Quick sortu má podobu pravidelného binárního kořenového stromu. 2 3 4 38
Stabilita řazení Xb Xc Xa Xb Xc Xa A4B33ALG 2010/06 Stabilita řazení Stabilní řazení nemění pořadí prvků se stejnou hodnotou. Hodnoty Xi jsou totožné Neseřazená data Xb Xc Xa Seřaď Seřazená data Xb Xc Xa 39
Stabilita řazení B1 D1 C1 A1 C2 B2 A2 D2 B3 A3 D3 C3 Insert Bubble A4B33ALG 2010/06 Stabilita řazení B1 D1 C1 A1 C2 B2 A2 D2 B3 A3 D3 C3 Insert Bubble Stabilní implementace -- A1 A2 A3 B1 B2 B3 C1 C2 C3 D1 D2 D3 B1 D1 C1 A1 C2 B2 A2 D2 B3 A3 D3 C3 Insert Bubble Nestabilní implementace QuickSort Select Sort Vždy nestabilní!! -- A2 A1 A3 B2 B3 B1 C3 C1 C2 D3 D2 D1 40
Stabilní řazení Záznam: Jméno Příjmení Vstup: Seznam seřazen A4B33ALG 2010/06 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 Barbara Charles Cook Amundsen Brown Andrew Amundsen stabilní řazení Barbara Amundsen Seřaď záznamy pouze podle" Charles Amundsen Andrew Brown Příjmení Barbara Brown Charles Brown Andrew Cook Barbara Cook Charles Cook Pořadí záznamů se stejným příjmením se nezměnilo 41
Nestabilní řazení QuickSort A4B33ALG 2010/06 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 Barbara Charles Cook Amundsen Brown Barbara Amundsen QuickSort Andrew Amundsen Charles Amundsen Barbara Brown Seřaď záznamy pouze podle: Charles Brown Andrew Brown Příjmení Charles Cook Andrew Cook Barbara Cook Pořadí záznamů se stejným příjmením se změnilo. 42