Algoritmizace a programování Třídící algoritmy - 12 IKT Algoritmizace a programování Algoritmizace a programování Třídící algoritmy - 12 Mgr. Josef Nožička www.zlinskedumy.cz
Anotace Materiál poskytuje žákům ucelený přehled nejznámějších třídících algoritmů. Musí být doplněn výkladem. Autor Mgr. Josef Nožička (Autor) Jazyk Čeština Očekávaný výstup 26–41-M/01 Elektrotechnika 78-42-M/01 Technické lyceum Speciální vzdělávací potřeby - žádné - Klíčová slova Třídění, algoritmus, posloupnost Druh učebního materiálu Prezentace Druh interaktivity Kombinované Cílová skupina Žák Stupeň a typ vzdělávání odborné vzdělávání Typická věková skupina 16 - 19 let Vazby na ostatní materiály Je součástí IKT.
Třídící algoritmy Metody třídění můžeme rozdělit do dvou hlavních skupin, a to na vnitřní třídění, kdy si můžeme dovolit všechna data načíst do (rychlé) paměti počítače, a na vnější třídění, kdy již třídění musíme realizovat opakovaným čtením a vytvářením diskových souborů. V tomto učebním textu se omezíme pouze na algoritmy vnitřního třídění, které dále dělíme na algoritmy s přímými metodami a algoritmy s nepřímými metodami.
Přímé metody Algoritmy z této skupiny jsou vesměs jednoduché, krátké a celé třídění provádějí přímo v poli dat. Většinou mají časovou složitost O(N2). Nejznámější algoritmy, založené na přímé metodě: Bubblesort Selectsort Insertsort
Nepřímé metody Tyto algoritmy jsou složitější, při třídění často využívají rekurze nebo rozdělení a zpětného slučování pole, které třídíme. Jsou rychlejší než algoritmy z předchozí skupiny, většinou mají časovou složitost O(N.log N). Nejznámější algoritmy, založené na nepřímé metodě: Quicksort Mergesort
Bubblesort Vývojový diagram: Zápis v prog. jazyce: for i:=1 to n−1 do Třídění je založeno na principu, že se postupně systematicky porovnávají dvojice sousedních prvků a vyměňují se spolu vždy, když menší číslo následuje po větším. Tak vlastně maximální prvek „probublá“ na správné místo na konci posloupnosti. Třídění končí, neprovedla-li se při průchodu posloupností žádná změna. Vývojový diagram: Zápis v prog. jazyce: for i:=1 to n−1 do begin for j:=1 to n-1 do if a[j]>a[j+1] then pom:=a[j]; a[j]:= a[j+1]; a[j+1]:=pom; end;
Selectsort Vývojový diagram: Zápis v prog. jazyce: for i:=1 to n−1 do Principem tohoto řazení je výběr mezního prvku (maximum nebo minimum) z tříděné posloupnosti a jeho záměna s prvním (posledním) prvkem. V dalším kroku máme pole o (n−1) prvcích a opakujeme totéž. Takto postupujeme až do úplného seřazení posloupnosti. Algoritmus končí, až nesetříděná část neobsahuje žádný prvek. Vývojový diagram: Zápis v prog. jazyce: for i:=1 to n−1 do begin for j:=i+1 to n do if a[i]>a[j] then pom:=a[i]; a[i]:=a[j]; a[j]:=pom; end;
Quicksort Popis algoritmu v krocích Quicksort je jeden z nejrychlejších algoritmů, založených na vnitřním třídění. Základní myšlenkou quicksortu je rozdělení řazené posloupnosti čísel na dvě přibližně stejné části (jedná se o algoritmus typu rozděl a panuj). V jedné části jsou čísla větší a ve druhé menší než zvolená hodnota (tzv. pivot). Pokud je tato hodnota zvolena dobře, jsou obě části přibližně stejně velké. Obě části se pak seřadí rekurzivně stejným postupem. Popis algoritmu v krocích Vybereme prostřední prvek (tzv. pivot). Prvky z levé strany, které jsou větší než pivot, vyměníme za prvky z pravé strany, které jsou menší než pivot (případně naopak – dle toho, zda třídíme vzestupně či sestupně). Obě části posloupnosti dotřídíme rekurzivně (aplikujeme pro ně body 1. a 2.) Třídění skončí, jakmile všechny rozdělené posloupnosti budou mít pouze 1 prvek.
Quicksort – zápis v prog. jazyce procedure Quicksort(var b:pole; m,n:integer); var i, j, p, x: integer; begin i:=m; j:=n; p:=b[(i+j)div 2]; repeat while b[i]<p do i:=i+1; while b[j]>p do j:=j−1; if i<=j then pom:=b[i]; b[i]:=b[j]; b[j]:=pom; end; until i>=j; if j>m then Quicksort(b, m,j); if i<n then Quicksort(b, i,n); end; begin Quicksort(b, 1, n);
Shrnutí Výběr nejvhodnějšího třídícího algoritmu závisí především na počtu třídících prvků. Je-li například počet prvků menší než 10, je v podstatě jedno, který třídící algoritmus použijeme. Při velkém počtu prvků se většinou vyplatí použít některý z algoritmů, založených na nepřímé metodě. Je však třeba brát v potaz i paměťové možnosti počítače, na němž bude příslušný program realizován.
Zdroje ORAVA, Martin. Animace třídících algoritmů a programových struktur. Uherské Hradiště: SŠPH Uherské Hradiště, 2010 (maturitní práce)