Třídění čísel v poli = vnitřní třídění (řazení)

Podobné dokumenty
Pseudonáhodná čísla = algoritmicky generovaná náhrada za náhodná čísla

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

= knihovna prostředků pro lepší práci s textovou obrazovkou, klávesnicí a generátorem zvuků

Digitální učební materiál

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Binární soubory (datové, typované)

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Digitální učební materiál

NPRG030 Programování I, 2018/19 1 / :03:07

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Programovací jazyk Pascal

Sada 1 - Základy programování

Příklady: (y + (sin(2*x) + 1)*2)/ /2 * 5 = 8.5 (1+3)/2 * 5 = /(2 * 5) = 1.3. Pavel Töpfer, 2017 Programování 1-3 1

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

NPRG030 Programování I, 2018/19 1 / :25:37

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

Prohledávání do šířky = algoritmus vlny

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

Algoritmizace řazení Bubble Sort

Úvod do programování 7. hodina

Lineární spojový seznam (úvod do dynamických datových struktur)

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Sada 1 - Základy programování

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

Už známe datové typy pro representaci celých čísel i typy pro representaci

Algoritmizace prostorových úloh

- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Třídění dat. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_26 04

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Algoritmizace a programování

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Uplatnění metod na zvolený jazyk

Aritmetické operace a obvody pro jejich realizaci

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

Úvod do programování

Datové typy a struktury

IAJCE Přednáška č. 9. int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) { // nikoli 0 if (Pole[i] > max) {

Základy algoritmizace a programování

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Grafové algoritmy. Programovací techniky

Grafové algoritmy. Programovací techniky

Universita Pardubice Fakulta elektrotechniky a informatiky. Mikroprocesorová technika. Semestrální práce

ALGORITMIZACE A PROGRAMOVÁNÍ

1. D Y N A M I C K É DAT O V É STRUKTUR Y

1. Chyby vstupních dat metody převedení úlohy na numerickou (řád použité metody) zaokrouhlovací reprezentace čísel v počítači

Abstraktní datové typy

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

Dynamické datové struktury III.

Předmět: Algoritmizace praktické aplikace

Datové struktury. alg12 1

Algoritmy I, složitost

Časová a prostorová složitost algoritmů

2 Strukturované datové typy Pole Záznam Množina... 4

Algoritmizace prostorových úloh

Maturitní téma: Programovací jazyk JAVA

NPRG030 Programování I, 2015/16 1 / :25:32

Dynamické datové typy a struktury

Sada 1 - Základy programování

NMIN102 Programování /2 Z, Zk

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Odvozené a strukturované typy dat

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

Algoritmizace a programování

Číselné soustavy. Binární číselná soustava

Časová složitost algoritmů

Jednoduché cykly

Anotace. Dámy na šachovnici dominance a nezávislost. Aritmetické výrazy, notace a převody mezi nimi, nejdelší rostoucí podposloupnost.

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Sada 1 - Základy programování

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

Pracovní listy - programování (algoritmy v jazyce Visual Basic) Algoritmus

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Elementární datové typy

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Algoritmizace prostorových úloh

Dynamické programování

Prioritní fronta, halda

Da D to t v o é v ty t py IB111: Datové typy

Anotace. Jednotky (tvorba a využití), struktury (typ record),

Abstraktní datové typy FRONTA

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Sada 1 - Základy programování

1. Implementace funkce počet vrcholů. Předmět: Algoritmizace praktické aplikace (3ALGA)

ADT/ADS = abstraktní datové typy / struktury

Racionální čísla, operátory, výrazy, knihovní funkce

NMIN101 Programování 1 2/2 Z --- NMIN102 Programování /2 Z, Zk

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Stromy. Jan Hnilica Počítačové modelování 14

Poslední aktualizace: 14. října 2011

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

I. ZÁVĚREČNÁ ZPRÁVA PROJEKTU

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

Transkript:

Třídění čísel v poli = vnitřní třídění (řazení) Úkol: uspořádat prvky pole podle velikosti (od nejmenšího po největší). Přímé metody - jednoduchý zápis programu - časová složitost O(N 2 ) vhodné jen pro malá data - třídí na místě (tzn. nepotřebují další datovou strukturu velikosti N) Pavel Töpfer, 2018 Programování 1-7 1

Třídění výběrem (přímý výběr, SelectSort) Algoritmus: Pole se dělí na setříděný úsek (vlevo) a nesetříděný úsek (vpravo). Na začátku tvoří všechny prvky nesetříděný úsek. V nesetříděném úseku pole se vždy najde nejmenší prvek a vymění se s prvním prvkem tohoto úseku, tím se nesetříděný úsek zleva zkrátí o jeden prvek. Realizace: na místě v jediném poli minima se postupně ukládají zleva, výměnou s původním hodnotami. 7 4 2 9 5 modře hotovo (setříděný úsek) 2 4 7 9 5 červeně minimum ze zbývajících hodnot 2 4 7 9 5 2 4 5 9 7 2 4 5 7 9 Pavel Töpfer, 2018 Programování 1-7 2

procedure PrimyVyber(var A: Pole); var i, j, k: integer; {indexy prvků} x: integer; {pro výměnu prvků} begin for i:=1 to N-1 do {umístit číslo na pozici i} begin k:=i; for j:=i+1 to N do {vyhledání minima} if A[j] < A[k] then k:=j; if k > i then {výměna prvků s indexy i, k} begin x:=a[k]; A[k]:=A[i]; A[i]:=x end end end; {procedure PrimyVyber} Pavel Töpfer, 2018 Programování 1-7 3

Třídění vkládáním (přímé zatřiďování, InsertSort) Algoritmus: Pole se dělí na setříděný úsek (vlevo) a nesetříděný úsek (vpravo). Na začátku je setříděný úsek tvořen pouze prvním prvkem pole. První prvek nesetříděného úseku se vždy zařadí podle velikosti do setříděného úseku, tím se nesetříděný úsek zleva zkrátí o jeden prvek. Realizace: na místě v jediném poli prvky setříděného úseku se posouvají o jednu pozici doprava, dokud je třeba. 7 4 2 9 5 modře hotovo (setříděný úsek) 4 7 2 9 5 červeně první ze zbývajících hodnot 2 4 7 9 5 (zatřiďovaný prvek) 2 4 7 9 5 2 4 5 7 9 Pavel Töpfer, 2018 Programování 1-7 4

procedure PrimeVkladani(var A: Pole); var i, j: integer; {indexy prvků} x: integer; {pro výměnu prvků} begin for i:=2 to N do {zatřiďujeme číslo z pozice i} begin x:=a[i]; j:=i-1; while (j > 0) and (x< A [j]) do begin {hledání správné pozice} A[j+1]:=A[j]; j:=j-1; end; A[j+1]:=x end end; {procedure PrimeVkladani} Pavel Töpfer, 2018 Programování 1-7 5

Bublinkové třídění (třídění záměnami, BubbleSort) Pozorování: ve vzestupně setříděném poli stojí vždy menší prvek před větším Algoritmus: Opakovaně se prochází pole a porovnávají se dvojice sousedních prvků, v případě špatného uspořádání (větší prvek před menším) se tyto prvky spolu vymění tím se v poli vytváří setříděný úsek. Možnosti realizace: průchody polem zleva doprava setříděný úsek vzniká odzadu (od největších prvků) průchody polem zprava doleva setříděný úsek vzniká odpředu (od nejmenších prvků) každý průchod může být vždy o jeden krok kratší než předchozí Pavel Töpfer, 2018 Programování 1-7 6

procedure BublinkoveTrideni(var A: Pole); var i, j: integer; {indexy prvků} x: integer; {pro výměnu prvků} begin for i:=1 to N-1 do for j:=1 to N-i do if A[j] > A[j+1] then {vyměnit sousední prvky} begin x:=a[j]; A[j]:=A[j+1]; A[j+1]:=x end end; {procedure BublinkoveTrideni} Možnosti zrychlení: - při příštím průchodu polem stačí jít jen do místa poslední uskutečněné výměny ( rychlejší zkracování průchodů, méně průchodů) - třídění přetřásáním pole se prochází střídavě zleva a zprava Pavel Töpfer, 2018 Programování 1-7 7

Zásobník (LIFO) realizace v poli - zásobník reprezentován polem Z: array [1..N] of T - N je kapacita zásobníku (kolik prvků může obsahovat najednou) - dno zásobníku: Z[1] - vrchol zásobníku (kde se přidávají a odebírají prvky): Z[V] - prázdný zásobník (také inicializace): V=0 Vložení hodnoty X do zásobníku (předpokládáme, že je tam na ni místo, tzn. V < N, jinak by bylo třeba přidat příslušný test): inc(v); Z[V]:=X; Odebrání hodnoty ze zásobníku a vložení do proměnné X (předpokládáme, že tam nějaká hodnota je, tzn. V > 0, jinak by bylo třeba přidat příslušný test): X:=Z[V]; dec(v); Obě operace mají konstantní časovou složitost. Pavel Töpfer, 2018 Programování 1-7 8

Fronta (FIFO) realizace v poli - fronta reprezentována polem F: array [1..N] of T - N je kapacita fronty (kolik prvků může obsahovat najednou) - konec fronty (místo příchodu do fronty): F[Prich] - začátek fronty (místo odchodu z fronty): F[Odch] - prázdná fronta (také inicializace): Prich=0 Vložení hodnoty X do fronty (předpokládáme, že je tam na ni místo, tzn. Prich < N, jinak by bylo třeba přidat příslušný test): inc(prich); F[Prich]:=X; Odebrání hodnoty z fronty a vložení do proměnné X (předpokládáme, že tam nějaká hodnota je, tzn. Odch <= Prich, jinak by bylo třeba přidat příslušný test): X:=F[Odch]; inc(odch); Pavel Töpfer, 2018 Programování 1-7 9

Problém: Obsazená část pole F se posouvá k vyšším indexům, časem není kam přidat další přicházející prvek, i když fronta není moc dlouhá a v poli F jsou volná místa po odebraných prvcích. Řešení: 1. Při každém odebrání prvku z fronty se obsazená část pole F posune o 1 místo doleva (tzn. stále platí Odch = 1, proměnou Odch tedy ani nepotřebujeme) časová složitost odebrání bude O(N): X:=F[1]; for I:=2 to Prich do F[I-1]:=F[I]; dec(prich); Pavel Töpfer, 2018 Programování 1-7 10

2. Posunutí obsazené části pole F se uskuteční jen když je to nutné, tzn. není-li místo na vkládaný prvek posunuje se méně často a na větší vzdálenost (vždy až do pozice Odch = 1). Časová složitost odebrání prvku z fronty zůstane tedy konstantní, časová složitost vkládání bude v nejhorším případě lineární (ale velmi často se provede vložení prvku v konstantním čase). if Prich = N then {plno, nejdřív posunout} begin for I:= Odch to Prich do F[I-Odch+1]:=F[I]; Prich:=Prich-Odch+1; Odch:=1 end; inc(prich); F[Prich]:=X; Pavel Töpfer, 2018 Programování 1-7 11

3. Pole F se chápe cyklicky, za F[N] následuje opět prvek F[1], obsazená část pole se nikdy neposouvá časová složitost obou operací zůstává konstantní. Vložení hodnoty X do fronty (předpokládáme, že je tam na ni místo): if Prich < N then inc(prich) else Prich:=1; F[Prich]:=X; Odebrání hodnoty z fronty a vložení do proměnné X: X:=F[Odch]; if Odch < N then inc(odch) else Odch:=1; Pavel Töpfer, 2018 Programování 1-7 12

Dlouhá čísla Chceme například počítat s kladnými celými čísly s max. 100 ciframi (podobně pro čísla se znaménkem, čísla desetinná apod.) Reprezentace: číslo uložíme po cifrách do prvků pole type Cislo = array [1..100] of byte; var A, B, C: Cislo; PA, PB, PC: byte; {počet cifer} Nutno zvolit, kam dáme kterou cifru je to jedno, ale potom důsledně dodržovat v celém programu! Např.: A[1] jednotky, A[2] desítky, A[3] stovky,, A[PA] cifra nejvyššího řádu (příjemnější počítání) nebo obráceně: A[1] cifra nejvyššího řádu,, A[PA] jednotky (snadnější načítání ze vstupu) Pavel Töpfer, 2018 Programování 1-7 13

Operace: - po cifrách jako sčítání, odčítání, násobení či dělení víceciferných čísel na základní škole - počítání modulo 10, přenosy do vyšších řádů Modifikace: číslo uložíme po dvojicích cifer do pole prvků typu byte, nebo po čtveřicích do prvků pole typu word, nebo dokonce po devíti cifrách do prvků pole typu longint úspora paměti, rychlejší výpočet (počítání modulo 100, nebo 10000, apod.) Desetinné číslo: stačí doplnit evidenci polohy desetinné čárky (buď speciální hodnota v prvku pole, nebo speciální proměnná s indexem nulového řádu, nebo dvě pole celá a desetinná část čísla) Pavel Töpfer, 2018 Programování 1-7 14

Příklad: součet kladných celých čísel A a B dáme do C (zvolená reprezentace čísla: A[1] = cifra jednotek) if PA < PB then M:=PA else M:=PB; {M délka kratšího čísla} Prenos:=0; for I:=1 to M do begin X := A[I] + B[I] + Prenos; C[I] := X mod 10; Prenos := X div 10 end; {dále podobně ošetřit přečnívající část delšího čísla a nakonec ještě případný nenulový přenos} Pavel Töpfer, 2018 Programování 1-7 15

Záznam - strukturovaný datový typ - co patří logicky k sobě, ať je u sebe i deklarováno - jednotlivé položky záznamu mohou být různých typů (libovolných, třeba i strukturovaných) - nedají se indexovat jako v poli, mají svá vlastní jména (identifikátory) - jména jednoznačná v rámci záznamu, ale ne vůči okolnímu světu type JménoTypu = record Položka1: TypPoložky1; Položka2: TypPoložky2; PoložkaN: TypPoložkyN end; - popis položek se řídí stejnými syntaktickými pravidly jako deklarace proměnných Pavel Töpfer, 2018 Programování 1-7 16

type Datum = record Den, Mesic, Rok: word end; var Dnes, Zitra: Datum; type Zamestnanec = record Jmeno: string[20]; Plat: word; Narozen: Datum; Deti: array[1..10] of string[20]; end; var Alois: Zamestnanec; Z: array[1..1000] of Zamestnanec; Pavel Töpfer, 2018 Programování 1-7 17

Operace S proměnnou typu záznam lze jako s celkem provádět jedinou operaci, a to dosazení mezi dvěma proměnnými téhož typu: Dnes:=Zitra; Z[3]:=Alois; Přístup ke složkám pomocí tečkové notace: JménoZáznamu.JménoPoložky - se složkou záznamu se pak manipuluje stejně jako s každou jinou proměnnou příslušného typu. Dnes.Den:=31; Dnes.Mesic:=12; read(alois.jmeno); Suma:=Suma + Alois.Plat * 2; Z[3].Narozen.Rok:=1945; Z[3].Deti[1]:= Pepicek ; Pavel Töpfer, 2018 Programování 1-7 18

Příklad: reprezentace dlouhého čísla Namísto dosavadní deklarace: type Cislo = array [1..100] of byte; var A, B, C: Cislo; PA, PB, PC: byte; {počet cifer} použijeme raději: type Cislo = record Cifry: array [1..100] of byte; PocetCifer: byte end; var A, B, C: Cislo; Pavel Töpfer, 2018 Programování 1-7 19

Podobný příklad: reprezentace polynomu a n x n + a n-1 x n-1 + a n-2 x n-2 + a 1 x + a 0 Dvě varianty: 1. ukládáme všechny členy polynomu včetně nulových, exponent slouží jako index v poli ( snadná manipulace) 2. ukládáme pouze nenulové členy, exponent se ukládá do pole společně s koeficientem (vhodné pro řídké polynomy) type Polynom1 = record Stupen: word; {stupeň polynomu} Koeficient: array[0..maxstupen] of real end; type Polynom2 = record Pocet: word; {počet nenulových členů} Clen: array[0..maxpocet] of record Koef: real; Exp: word end; end; Pavel Töpfer, 2018 Programování 1-7 20

Inicializovaná proměnná typu záznam const LetosniPrvniMaj: Datum = (Den: 1; Mesic: 5; Rok: 2004); type Complex = record X, Y: real end; const Z: Complex = (X: 2.0; Y: 3.5); Pavel Töpfer, 2018 Programování 1-7 21

Inicializované pole - inicializovaná proměnná může být typu pole - hodnoty prvků se vypisují do závorek oddělené čárkami - u vícerozměrných polí více úrovní závorek const Mesice: array[1..12] of byte = (31,28,31,30,31,30,31,31,30,31,30,31); const C: Obdelnik = ( (1,2,3,4), (0,1,1,0), (9,8,7,6) ); Pavel Töpfer, 2018 Programování 1-7 22

Příkaz WITH - použití: pro snadnější přístup k více položkám téhož záznamu - syntaxe: with JménoZáznamu do Příkaz - sémantika: v rámci Příkazu se před každý identifikátor, kde to má syntaktický smysl, jakoby přidá tečkou oddělené JménoZáznamu with Z[1] do read(jmeno, Plat, Narozen.Den, Narozen.Mesic, Narozen.Rok); with Alois do begin Jmeno:= Alois Jirasek ; Plat:= 10000; Deti[1]:= Kaspar ; Deti[2]:= Melichar ; Deti[3]:= Baltazar end; Pavel Töpfer, 2018 Programování 1-7 23

Návrh a vytváření programu - shora: Začínáme kostrou programu, píšeme jenom to podstatné, nerozptylujeme se zbytečnými detaily. Pomocné dílčí akce zatím odbudeme voláním procedury, která vykoná požadovanou činnost ještě ji nemáme, víme jen co by měla dělat, ale nevíme, jak to bude dělat (ale to nevadí, však on ji pak někdo dopíše, v nejhorším my sami). Program postupně zjemňujeme, doplňujeme do něj dříve vynechané procedury. - zdola: Nejprve si napíšeme procedury realizující dílčí akce, které budou v budoucím programu zapotřebí. S jejich pomocí naprogramujeme procedury realizující větší celky. Atd. až budeme mít celý program. Pavel Töpfer, 2018 Programování 1-7 24

Ladění programu - shora: Nečekáme na celý program, ladíme ho průběžně během vytváření (tzn. nejdříve jeho kostru). Zatím chybějící procedury nahradíme provizorními procedurami, které sice nevykonávají potřebnou akci, ale dávají nějaký triviální výstup (třeba pevně zvolenou hodnotu) v požadovaném tvaru. - zdola: Nečekáme na celý program, ladíme ho průběžně během vytváření (tzn. nejdříve dílčí procedury). Pro otestování správné funkce jednotlivých procedur si vytváříme pomocné testovací programy, které procedury volají se zvolenými parametry a vypisují (případně i testují) jejich výstupy. Pavel Töpfer, 2018 Programování 1-7 25