Proč se vůbec řazením zabýváme? Proč chceme posloupnosti dat řadit? Zkuste podrobně popsat vlastními slovy postup, jak seřadit: * 10 hracích karet do ruky při rozdávání * nastoupenou fotbalovou jedenáctku v dresech, pokud má předstoupit o krok dopředu seřazená podle čísel na dresech * 200 písemek podle abecedy, jsou-li k dispozici 4 pomocníci * lidi stojící ve frontě v úzké chodbě podle data narození (pokud každý může mluvit jenom se svým sousedem) Všechny asociativní řadící algoritmy patří do třídy (n log2 n). Dokážete najít algoritmus, který jisté typy posloupností uspořádá rychleji, tj. v čase o(n log2 n)? Na čem je založen princip fungování algoritmu Bubblesort? Jaká je jeho složitost v nejlepších, průměrných a nejhorších případech? Je tento algoritmus stabilní? Chová se přirozeně? Je 'in situ' algoritmus? Na čem je založen princip fungování algoritmu Insertsort? Jaká je jeho složitost v nejlepších, průměrných a nejhorších případech? Je tento algoritmus stabilní? Chová se přirozeně? Je 'in situ' algoritmus? Na čem je založen princip fungování algoritmu Selectsort? Jaká je jeho složitost v nejlepších, průměrných a nejhorších případech? Je tento algoritmus stabilní? Chová se přirozeně? Je 'in situ' algoritmus? Pomocí algoritmu Mergesort seřaďte posloupnost [6,3,8,3,7,3,6,1,4]. Pomocí algoritmu Quicksort seřaďte posloupnost [6,3,8,3,7,3,6,1,4]. Dojde v chování následujícího algoritmu (Dijkstrův quicksort) k zásadní změně pokud nahradíme test na řádku č. 8 testem ia do j:=j-1; 8: if i<=j then 9: swap(A[i],A[j]); 10: i:=i+1;j:=j-1; 11: until i>j; 12: if l A[i + 1]) then swap(A[i], A[i + 1]); swapped = true; right = right - 1; for (i = right; i > left; i = i - 1) if (A[i] < A[i - 1]) then swap(A[i], A[i - 1]); swapped = true; left = left + 1; end; Který algoritmus řazení je nejlepší? Název Časová složitost Min Prům Max bubblesort - řaz. výměnou (n) (n2 ) (n2 ) heapsort - řaz. haldou (n log n) (n log n) (n log n) insertsort - řaz. vkládáním (n) (n2 ) (n2 ) mergesort - řaz. slučováním (n log n) (n log n) (n log n) quicksort - řaz. rozdělováním (n log n) (n log n) (n2 ) selectsort - řaz. výběrem (n2 ) (n2 ) (n2 ) Pokud známe uspořádání dvojic (a, b) a (b, c), můžeme něco usoudit i o dvojici (a, c)? Ve kterých případech? Uveďte příklady využití v algoritmech řazení. Jak vypadají nejvíce (nejméně) příznivá vstupní data pro algoritmus insertsort? procedure insertsort(A[0..n-1]); int i, j, temp; begin for i: = 1 to n-1 do temp := A[i]; j := i; while ((j > 0) and (A[j-1] > temp)) do A[j] := A[j-1]; j := j-1; A[j] := temp; end; Porovnejte následující programy xsort a ysort. Jaký koncept mají společný? V čem se zásadně liší? procedure xsort A[low,high]: if low[Int] mergeSort[] = [] mergeSort[x] = [x] mergeSort s = merge (mergeSort u) (mergeSort v) where (u,v) = splitAt (n 'div' 2) s n = length s merge s [] = s merge [] t = t merge (x:u)(y:v) = if x <= y then x:merge u (y:v) else y:merge (x:u) v quickSort :: [Int]->[Int] quickSort [] = [] quickSort (p:t) = quickSort lt ++ [p] ++ quickSort gs where lt = [x | x<-t, x=p] Algoritmy mergeSort a quickSort ­ imperativní varianta: var A[1..n]:integer; procedure mergeSort(p,r:integer); procedure quickSort(p,r:integer); var q:integer; var q:integer; begin begin if pr or A[i]<=A[j]) if A[j]>=x then then i:=i+1; B[k]:=A[i]; swap(A[i],A[j]); i:=i+1; swap(A[i+1],A[r]); else return(i+1); B[k]:=A[j]; end; j:=j+1; for k:=p to r do A[k]:=B[k]; end;