Umíte pascalsky - 20.lekce ... |
Umíte pascalsky? 20.lekce |
Vytisknout |
|||||||||||||||||||||||||||||||||||||||||||||||||||
Třídění (řazení) pole II. Třídění pole je vhodné téma na procvičování tvorby algoritmů. Proto se ještš dnešní lekci věnujeme dalším metodám třídění. Dnes si ukážeme: A. Třídění vsouváním (zatřiďováním) - InsertSort B. Schellovo třídění - ShellSort Třídění vsouváním (zatřiďováním) - InsertSort Toto je jeden z logicky nejpřirozenějších způsobů třídění. Postupně zasouváme (zatřiďujeme) prvky na místa, kam podle velikosti patří. Ukážeme si tuto metodu na příkladě: Příklad: Uspořádejte čísla 8 3 1 2 2 zatřiďováním. ![]() Začneme od druhého prvku (3). Porovnáním s prvním prvkem (8) zjistíme, že patří před něj. Trojku vyjmeme, osmičku posuneme o jedno místo doprava a na uvolněné místo vložíme trojku. Přejdeme na třetí prvek (1). Porovnáním s prvním prvkem (3) zjistíme, že patří před něj. Jedničku vyjmeme, posuneme úsek čísel 3 8 o jedno místo doprava a na uvolněné místo vložíme jedničku. Takto pokračujeme dále ... Naposled tento postup opakujeme pro poslední prvek (2). Porovnáváním tohoto prvku s prvky od začátku pole zjistíme, kam podle velikosti patří (na místo prvku s pořadím index, tedy 2), prvek vyjmeme, úsek před ním (od něj až po místo kam patří - index) posuneme o jedno místo doprava a na uvoněné místo vložíme tento prvek. Tím bude celé pole seřazené. Myšlenka (hrubý algoritmus): Od druhého do posledního prvku pole opakujeme tuto činnost: - najdeme místo v předchozím úseku, kam tento prvek podle velikosti patří - vyjmeme tento prvek - posuneme předchozí prvky (až k místu kam patří) o jedno místo doprava - vložime prvek na uvolněné místo Upřesníme jednotlivé kroky: ![]() najdeme místo - aktuální prvek (cisla[ktery]) opakovaně porovnáváme s prvky od začátku pole. Je-li aktualní prvek větší než první, porovnáváme s druhý prvkem atd., až dojdeme k prvku (cisla[index]), který už není menší než aktuální prvek. Na toto místo patří - udává proměnná index. vyjmeme prvek - zkopírujeme si ho do pomocné proměnné (prvek) posuneme předchozí prvky (až k místu kam patří) - asi nejobtížnější část. Prvky úseku cisla[index] ... cisla[ktery-1] posouváme postupně od konce o jedno místo doprava. Tedy opakovaně pro proměnnou kde od ktery zpět do index+1 provádíme přiřazení cisla[kde]:=cisla[kde-1]. Tím se nám uvolní místo po prvku cisla[index] vložíme prvek na uvolněné místo - představuje definování nové hodnoty cisla[index] pomocí proměnné prvek Výslednou proceduru Trideni_vsouvani najdete o kousek dál. Schellovo třídění - ShellSort Třídění probubláváním (postupnými výměnami) lze výrazně urychlit tím, že budeme vždy procházet celé pole a nebudeme porovnávat sousední prvky, ale prvky vzdálené o hodnotu krok , tedy cisla[ktere] a cisla[ktere+krok] a to tak dlouho, dokud bude docházet k nějakým výměnám. Pro krok platí: počáteční krok . . . krok = (1 + pocet) div 2 následující krok . . . krok = (krok + 1) div 2 Naposledy se uvedené výměny provádí pro krok=1 a po jejich realizaci bude pole uspořádané. Příklad: Uspořádejte čísla 39 57 63 13 24 95 73 15 pomocí Shellova třídění: ![]() Myšlenka (hrubý algoritmus): Bude za domácí úkol. Příklad: Doplňte program Razeni o volbu řazení zatřiďováním. Program Razeni (pouze s dnešní procedurou Trideni_vsouvani) může vypadat takto:
Domácí úkol: Doplňte program Razeni o volbu Trideni_shell pro seřazení pole Shellovou metodou. On-line účast na řešení úkolu
Pomocí volby Řešit můžete (po přihlášení) odeslat vaše řešení domácího úkolu (každý úkol smíte řešit jen jednou). Volbou Hodnocení si přečtete hodnocení a komentář od vyučujícího. Dotaz nebo připomínku můžete opakovaně zasílat pomocí tlačítka Dotazy, Komunikace (na levém okraji) zobrazuje příklad možné komunikace s vyučujícím. |