A4B33ALG 2010/05 ALG 07 Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated Quicksort Stabilita řazení 1
Selection sort Neseřazeno Seřazeno Start T O U B J R M A K D Z E min T O U B J R M A K D Z E Krok1 A O U B J R M T K D Z E 2
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 3
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 4
Selection sort for( int i = 0; i < n-1; i++ ){ // select min jmin = i; for( int j = i+1; j < n; j++ ) if( a[j] < a[jmin] ) jmin = j; } // put min to its place min = a[jmin]; a[jmin] = a[i]; a[i] = min; 5
Selection sort Krok k A B D E J K M T R U Z O n min k n-k Výběr minima. (n-k) testů Celkem testů n 1 (n k) 1 n 1 n(n 1) n k n(n 1) n k 1 k 1 k 1 2 1 (n 2 n) 2 Algoritmus a program není totéž 6
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 7
Selection sort Shrnutí Celkem testů 1 2 (n n) 2 = (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 Sortu je (n 2 ) 8
Insertion sort Start T O B K U R M A J D Z E Krok1 T O B K U R M A J D Z E O T B K U R M A J D Z E 9
10 B D E M O R Z T A J K U D E M O R Z T A J K U B D E M O R Z A J K U T D E M O R Z A J U T K B B Insertion sort Krok 2 Krok 3
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 11
Insertion sort for( int i = 1; i < n; i++ ){ // find & make place for a[i] insval = a[i]; int 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 Krok k B K M 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
Insertion sort Celkem testů Shrnutí n 1 = (n) (n 2 n)/2 = (n 2 ) (n 2 +n 2)/4 = (n 2 ) nejlepší případ nejhorší případ 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 Sortu je O(n 2 ) (!!) 14
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 15
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 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 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 18
Insertion sort for( int lastpos = n-1; lastpos > 0; lastpos-- ) for( int 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 n) 2 = (n 2 ) Celkem přesunů 1 2 (n n) 2 0 = (1) = (n 2 ) nejlepší případ nejhorší případ Asymptotická složitost Bubble Sortu je (n 2 ) 19
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! úloha "jejich" práce naše práce úloha Rozděl! úloha Rozděl! úloha Vyřeš částečnou úlohu Vyřeš částečnou úlohu Sluč! Sluč! řešení řešení řešení 21
Quicksort 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á 22
Quicksort Dvě samostatné úlohy E A K D J B Rozděl! 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! 23
Quicksort A B D E J K M O R T U Z Opanováno! 24
Quicksort Dělení Pivot pivot Init Pivot M il ir M A K D R B T O J U Z E 25
Quicksort Dělení Pivot il ir Krok 1 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 26
Quicksort 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 27
Quicksort Dělení Krok 3 Pivot M ir il 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 28
Quicksort 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 29
Quicksort 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 il B ir A D K J E T O R U Z M 30
Quicksort Dělení Pivot B il ir B A D K J E T O R U Z M Krok 1 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 31
Quicksort 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 32
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--;} il K il K D ir ir K K K D U D K } while( il <= ir ); } if( low < ir ) qsort( a, low, ir ); if( il < high ) qsort( a, il, high ); Rozděl! 33
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
Quicksort 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 Sortu je O(n 2 ),... ale! : Očekávaná složitost Quick Sortu je (n log 2 (n)) (!!) 35
Quicksort Porovnání efektivity 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 tab. 1 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ů 36
Quicksort Ukázka průběhu 8 5 12 6 10 11 2 4 1 3 7 9 7 5 3 6 1 4 2 11 10 12 8 9 pivot = = první v úseku 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
Quicksort 8 5 12 6 10 11 2 4 1 3 7 9 7 5 3 6 1 4 2 11 10 12 8 9 2 5 3 6 1 4 7 9 10 8 11 12 1 5 3 6 2 4 8 9 10 4 3 2 2 3 4 5 6 Schéma rekurzivního volání Quick sortu má podobu pravidelného binárního kořenového stromu. 38
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 39
Stabilita řazení 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 40
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 41
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. 42