Triedenie. Príklad T.1 Vytvorte funkciu, ktorá zistí počet rôznych hodnôt v poli.

Podobné dokumenty
PODPROGRAMY. Vyčlenenie podprogramu a jeho pomenovanie robíme v deklarácii programu a aktiváciu vykonáme volaním podprogramu.

Funkcia - priradenie (predpis), ktoré každému prvku z množiny D priraďuje práve jeden prvok množiny H.

Pracovné prostredie MS EXCEL 2003.

Polia a matice v jazyku C. Michal Kvasnica

Krížovka. Hot Potatoes JCross ( červená farba) = vytvorenie krížovky, do ktorej vpisujeme odpovede na zadané otázky. Priradenie

MANUÁL K TVORBE CVIČENÍ NA ÚLOHY S POROZUMENÍM

8. Relácia usporiadania

Jednoduchá správa pamäte

Manuál na prácu s databázou zmlúv, faktúr a objednávok Mesta Martin.

Metóda vetiev a hraníc (Branch and Bound Method)

7.1 Návrhové zobrazenie dotazu

M úlohy (vyriešené) pre rok 2017

P R O L U C. POZNÁMKY individuálnej účtovnej závierky pre rok 2014

Užívateľská príručka systému CEHZ. Základné zostavy Farmy podľa druhu činnosti

Imagine. Popis prostredia:

Strojový kód, assembler, emulátor počítača

DVDStyler. Získanie programu. Inštalovanie. Začíname tvoriť DVD

NA POUŽITIE ŠABLÓNY PRE PÍSANIE ZÁVEREČNEJ PRÁCE

Komunikácia a práca so systémom TIPES program TIPES dos.

Vytvorenie používateľov a nastavenie prístupov

Elektronické odosielanie výplatných pások

Import Excel Univerzál

Užívateľský manuál Technický server SKGA ročná kontrola HCP

VECIT 2006 Tento materiál vznikol v rámci projektu, ktorý je spolufinancovaný Európskou úniou. 1/4

Hromadná korešpondencia v programe Word Lektor: Ing. Jaroslav Mišovych

Vážení používatelia programu WISP.

Školenie HYPO Novinky v programoch HYPO, MEMO a HYPOCAD. Materiál ku školeniu

Naformátuj to. Naformátuj to. pre samoukov

Dell S2718H/S2718HX/S2718HN/ S2718NX Dell Display Manager Návod na obsluhu

Microsoft Outlook. Stručný prehľad základných funkcií. Ing.Anna Grejtáková, SPP DFBERG

Príklad ponuky: Riešenie: vrch. hodnota 3 hodnota 2 hodnota 1

Dealer Extranet 3. Cenové ponuky

Užívateľská príručka k funkcii Zastavenie a pretočenie obrazu

Total Commander. Základné nastavenia

Úroveň strojového kódu procesor Intel Pentium. Adresovanie pamäte

nastavenie a realizácia vzájomných zápočtov v Money S4 / Money S5

MANUÁL K PROGRAMU MATEMATIKA 2.0 STIAHNUTIE A INŠTALÁCIA PROGRAMU:

Operačná analýza 2-12

Základy optických systémov

ZÁKLADY TEÓRIE GRAFOV

Import cenových akcií FRESH

TomTom Referenčná príručka

Návod na použite plaftormy ELMARK E- Business obsahuje popis hlavných možností a funkcií programu. Príručka je štruktúrovaná podľa poradia možností.

Textový editor WORD. Práca s obrázkami a automatickými tvarmi vo Worde

Pred samotnou prácou s objednávkami odporúčame vykonať súvisiace nastavenia cez menu Firma - Nastavenie

UŽÍVATEĽSKÁ PRÍRUČKA. TCP Optimizátor

Formuláre PowerPoint MGR. LUCIA BUDINSKÁ,

Výstupný test projektu KEGA pre 7. roč. ZŠ. Verzia B

Výstupný test projektu KEGA pre 7. roč. ZŠ. Verzia A

KOMISNÝ PREDAJ. Obr. 1

Rozšírený zápis ZoznamŠkôl.eu

Program "Inventúra program.xlsm"

Microsoft POWERPOINT XP

Zavedenie SEPA a s tým súvisiace zmeny v IS NORIS

Ako zamedziť tvorbe plesní v byte?

MAIS. Verejný portál - kalendárny rozvrh. Používateľská minipríručka pre používateľov systému MAIS. APZ Bratislava

Starogrécky filozof Demokritos ( pred n.l) Látky sú zložené z veľmi malých, ďalej nerozdeliteľných častíc - atómov

1. Otec, mama a dcéra majú spolu 69 rokov. Koľko rokov budú mať spolu o 7 rokov? a) 76 b) 90 c) 83 d) 69

INTERNET BANKING. Platby cez Internet banking VŠETKO, ČO JE MOŽNÉ. with.vub.sk, Bank of

Ako funguje stav účtu - prehľad o platbách na zdravotné odvody

Moderné vzdelávanie pre vedomostnú spoločnosť/projekt je spolufinancovaný zo zdrojov EÚ. Grafy

1.2 Triedenie podľa kvantitatívnych znakov

F akulta B aníctva, E kológie, R iadenia a G eotechnológií. Mozilla Firefox. Ing. Anna Grejtáková SPP D FBERG 2011

Návod k servisnému programu pre fiskálny modul FM2000. manuál. (c)varos

NEINTERAKTÍVNA KOMUNIKÁCIA

ALGORITMY A PROGRAMOVANIE VO VÝVOJOVOM PROSTREDÍ LAZARUS. Vývojové prostredie Lazarus, prvý program

Zásady volieb do Akademického senátu Fakulty medzinárodných vzťahov Ekonomickej univerzity v Bratislave

AIS2 Hodnotenie študentov po skúške POMÔCKA PRE VYUČUJÚCICH

Základy algoritmizácie a programovania

Návod na vkladanie záverečných prác do AIS

Náhrada i:key nová služba Internet banking TB aktívny bez limitu

Pripojenie na internet cez WiFi pre zamestnancov a študentov

Vzdelávací program: INOVAČNÉ VZDELÁVANIE PEDAGOGICKÝCH ZAMESTNANCOV ŠKÔL V OBLASTI INKLUZÍVNEHO VZDELÁVANIA DETÍ Z MARGINALIZOVANÝCH RÓMSKYCH KOMUNÍT

Zaciatok programovania na

RECYKLAČNÝ FOND NASTAVENIE PROGRAMU PRE POTREBY RECYKLAČNÉHO FONDU

Téma : Špecifiká marketingu finančných služieb

Manuál pre Registrovaných používateľov / Klientov

Predaj cez PC pokladňu

Programovanie v jazyku C - struktury a polia

Programovanie.NET, C++ - najbližšie termíny:

OBOZNÁMTE SA S VAŠÍM TELEFÓNOM

RIEŠENIE NIEKTORÝCH ÚLOH LINEÁRNEJ ALGEBRY V PROSTREDÍ MS EXCEL. 1. Zadáme prvky matice A a B do buniek pracovného hárku zošita MS Excel

Skákalka. Otvoríme si program Zoner Callisto, cesta je Programy Aplikácie Grafika Zoner Callisto.

Externé zariadenia Používateľská príručka

Integrovaný prístup v efektívnom vyučovaní vybraných slov

Obchodná akadémia Ružomberok Ing. Igor Rosa

OBOZNÁMTE SA S VAŠÍM TELEFÓNOM

Pokročilé funkcie Word-u MGR. LUCIA BUDINSKÁ,

Ekvia s.r.o EKVIA PREMIUMPRO. Užívateľský manuál

Algoritmizace řazení Bubble Sort

Návod na rýchlu inštaláciu WIFI. Superrýchle wifi kdekoľvek vo vašej domácnosti

MATLAB (1) - úvod do programovania vedeckých problémov. LS 2017, 8.predn.

Návod na nastavenie oprávnení pre oprávnené osoby s udeleným čiastočným prístupom

Inventúra účtov- základný popis.

Návrh postupu pre stanovenie počtu odborných zástupcov na prevádzkovanie verejných vodovodov a verejných kanalizácií v správe vodárenských spoločnosti

Obsah Úvod... 3 Zapnutie makra... 4 Vyplnenie formulára... 6 Naplnenie hlavnej knihy... 7 Naplnenie stavu zamestnancov... 7 Mapa modulov...

Kvadratické funkcie, rovnice, 1

Prevody z pointfree tvaru na pointwise tvar

Manuál pre používanie programu KonverziaXML_D134

Školská sieť EDU. Rozdelenie škôl. Obsah: Deleba škôl podľa času zaradenia do projektu: Delba škôl podľa rýchlosti pripojenia:

Transkript:

Triedenie je činnosť, po skončení ktorej pre všetky dovolené hodnoty indexov poľa platí, že pole[i] pole[i+1]. Pre triedenie zoznamov (list, a teda aj našich polí) máme v Pythone k dispozícii funkciu zoznam.sort() a funkciu sorted(zoznam). Funkcia zoznam.sort() zmení daný zoznam (je na úrovni príkazu). Funkcia sorted(zoznam) vráti nové utriedené pole (funkcia sorted() vystupuje na pravej strane príkazu priradenia, napr. utriedenepole = sorted(zoznam)). Použitie metódy sort: import pole poleint.sort() pole.vypis(poleint) Počet prvkov poľa: 10 [86, 1, 43, 100, 72, 45, 47, 91, 46, 46] [1, 43, 45, 46, 46, 47, 72, 86, 91, 100] Použitie funkcie sorted: import pole poleintutr = sorted(poleint) print(poleintutr) print(poleint) Počet prvkov poľa: 13 [21, 78, 66, 36, 21, 53, 6, 49, 25, 49, 22, 8, 13] [6, 8, 13, 21, 21, 22, 25, 36, 49, 49, 53, 66, 78] [21, 78, 66, 36, 21, 53, 6, 49, 25, 49, 22, 8, 13] Funkcia sort() aj sorted() môžu mať pri volaní ešte parameter key (použitie je nad rámec nášho kurzu) a parameter reverse, ktorý, ak má hodnotu True, pole utriedi zostupne (predvolená hodnota parametra reverse je False, t.j. vzostupné utriedenie poľa). Príklad T.1 Vytvorte funkciu, ktorá zistí počet rôznych hodnôt v poli. def vratpocetroznychhodnot(pole): pom = sorted(pole) pocetroznych = 1 for i in range(1,len(pom)): if pom[i]!= pom[i-1]: pocetroznych += 1 return pocetroznych print("počet rôznych prvkov v poli: " + str(vratpocetroznychhodnot(poleint))) Počet prvkov poľa: 10 1. prvok: Adam 2. prvok: Adela 3. prvok: Dáša 4. prvok: Peter 5. prvok: Pavol 1

6. prvok: Zuzana 7. prvok: Adela 8. prvok: Zuzana 9. prvok: Pavol 10. prvok: Adela ['Adam', 'Adela', 'Dáša', 'Peter', 'Pavol', 'Zuzana', 'Adela', 'Zuzana', 'Pavol', 'Adela'] Počet rôznych prvkov: 6 Je dobré ovládať nejaký triediaci algoritmus, jednak na zdokonalenie algoritmického myslenia, a aj pre prípad, že by daný programovací jazyk nemal priamo implementovaný niektorý z triediacich algoritmov. Triediace algoritmy, ako si ukážeme, možno použiť aj pri iných úlohách, ako len utriedení celej skupiny dát. Rozlišujeme algoritmy vnútorného a vonkajšieho triedenia. Vnútorné triedenie používame vtedy, ak sa celá množina dát určená na triedenie zmestí do vnútornej pamäte počítača. Údaje sa uložia do poľa a triediaci algoritmus má k nim priamy prístup. Vonkajšie triedenie pracuje s dátami uloženými v súbore na vonkajšej pamäti, pretože sa všetky nezmestili do vnútornej pamäte počítača. Vonkajším triedením sa nebudeme zaoberať. Algoritmov vnútorného triedenia je viacej a navzájom sa líšia zložitosťou a tomu zodpovedajúcou efektívnosťou triedenia (čím jednoduchší algoritmus, tým menej efektívny). Pri výbere triediaceho algoritmu možno prihliadať aj na veľkosť vstupných údajov, pri niekoľko sto prvkových poliach je najpomalší triediaci algoritmus prakticky rovnako rýchly ako ten najrýchlejší, ktorého napísanie a pochopenie nám môže trvať výrazne dlhší čas. Najjednoduchšie vnútorné triediace algoritmy majú niekoľko spoločných rysov zápis algoritmu je krátky a jednoduchý, časová zložitosť je kvadratická (triedenie sa realizuje cyklom v cykle). Sem patria napríklad bublinkové triedenie (triedenie výmenou, Bubble sort), triedenie priamym vkladaním (vsúvaním, Insertion sort), triedenie priamym výberom (Select sort) atď. T.2 Naprogramujte triedenie výmenou bublinkové triedenie (Bubble sort). Už samotné bublinkové triedenie môže mať veľa variant, od dvoch vnorených cyklov s pevným počtom opakovaní, až po vonkajší cyklus s opakovaním, pokým dochádza k výmene pri prechode poľom. Porovnávať tiež môžeme prvky pole[i-1] a pole[i], alebo pole[i] a pole[i+1], ísť od prvého alebo posledného prvku poľa a pod. T.2.1 Vytvorte triediaci algoritmus, ktorý bude porovnávať dva vedľa seba stojace prvky, a ak je ľavý väčší ako pravý, vymení ich. Určte potrebný počet prechodov poľom. Napríklad Pôvodné pole 5 3 4 2 1 Pri 1. prechode sa vymenili 5 a 3 5 a 4 5 a 2 5 a 1 5 Po 1. prechode 3 4 2 1 5 Po 2. prechode 3 2 1 4 5 Po 3. prechode 2 1 3 4 5 Po 4. prechode 1 2 3 4 5 Z príkladu vidieť, že poľom treba prejsť pri N prvkoch N-1 krát. Hodnota N je dĺžka poľa, teda N = len(pole). def utriedbubble(pole): Bubble sort po prvom prechode je najväčší prvok na svojom mieste for cp in range(1,len(pole)): # cp - číslo prechodu poľom: prvý, druhý,..., len(pole)-1 for i in range(0,len(pole)-cp): if pole[i]>pole[i+1]: pole[i], pole[i+1] = pole[i+1], pole[i] Pri uvedenej procedúre sa poľom prejde len(pole)-1 krát, kde len(pole) udáva počet prvkov poľa (vonkajší cyklus). Pri každom prechode poľom (vnútorný cyklus) sa porovnávajú dva vedľa seba ležiace prvky (pole[i] a pole[i+1]) a ak je ľavý prvok väčší ako pravý, vymenia sa. Po prvom prechode poľom musí byť na svojom mieste najväčší 2

prvok v poli, po druhom druhý najväčší atď. čo umožňuje skracovať vnútorný cyklus o hodnotu cp (po prvom prechode poľom už netreba porovnať posledný prvok, po druhom prechode ani predposledný prvok atď.). Po len(pole)-1 prechodoch poľom (vonkajší cyklus) je na svojich miestach sprava počet-1 prvkov a teda pole je utriedené (najmenší prvok prvý zľava, nemá inú možnosť, len byť na prvom mieste v poli, keďže všetky väčšie prvky boli presunuté doprava). poleintutr = utriedbubble(poleint[:]) print("pôvodné pole:", poleint) print("utriedené pole:", poleintutr) T.2.2 Analyzujte nasledujúci triediaci algoritmus: def utriedbubblex(pole): Bubble sort po prvom prechode je najmenší prvok na svojom mieste for cp in range(len(pole)-1): # cp nadobúda hodnoty: 0, 1, 2,..., len(pole)-2 for i in range(len(pole)-1, cp, -1): if pole[i] < pole[i-1]: pole[i], pole[i-1] = pole[i-1], pole[i] T.2.3* Vytvorte verziu bublinkového triedenia, v ktorej, ak už nenastala výmena pri prechode poľom, triedenie sa ukončí. T.3 Naprogramujte triedenie výberom Selection sort. Triedenie výberom sa môže realizovať cez minimá alebo maximá. Opis algoritmu triedenia cez minimá: nájdeme najmenší prvok poľa a vymeníme ho s prvkom na prvom mieste v poli, potom vyberieme druhý najmenší a vymeníme ho s prvkom na druhej pozícii v poli atď. až po posledný prvok poľa (stačí predposledný prvok poľa, najväčší prvok musí už byť na poslednom - správnom mieste). Inou možnosťou je nájsť najväčší prvok poľa a vymeniť ho s posledným, následne vybrať druhý najväčší a vymeniť s predposledným prvkom poľa atď. def selectionsort(pole): Selection sort cez minimá nájde najmenší prvok a vymení ho s prvým, potom druhý najmenší a vymení ho s druhým prvkom v poli atď. dh = 0 # nastavenie dolnej hranice prehľadávanej oblasti poľa while dh < len(pole)-1: inxmin = dh # počiatočná hodnota indexu minima for i in range(dh + 1, len(pole)): # prehľadávanie zvyšnej časti poľa if pole[i] < pole[inxmin]: inxmin = i # nový index minima v prehľadávanej oblasti pole[dh], pole[inxmin] = pole[inxmin], pole[dh] # výmena dh += 1 # zvýšenie dolnej hranice prehľadávanej oblasti poľa poleintutr = selectionsort(poleint[:]) pole.vypis(poleintutr) print("kontrola:") poleint.sort() pole.vypis(poleint) Poznámka: Skupinu príkazov dh = 0, while dh < len(pole)-1: a dh += 1 možno nahradiť for-cyklom. 3

Variant s využitím štandardných funkcií min() a index() pre zoznamy: Python - študijný text def selectionsortfu(pole): Selection sort cez minimá využívajúci štandardné funkcie min() a index() pre zoznamy dh = 0 # nastavenie dolnej hranice prehľadávanej oblasti poľa while dh < len(pole)-1: lokmin = min(pole[dh:]) # lokmin je minimum v časti pole[dh:] inxmin = pole[dh:].index(lokmin) # index prvého výskytu lokmin v prehľadávanej časti poľa pole[dh], pole[dh+inxmin] = pole[dh+inxmin], pole[dh] # výmena dh += 1 # posunutie dolnej hranice prehľadávanej oblasti poľa Selection sort cez maximá: def utriedcezmaxima(pole): Selection sort cez maximá nájde najväčší prvok poľa a vymení ho s posledným v poli, potom druhý najväčší a vymení ho s druhým prvkom od konca poľa atď. hh = len(pole) # nastavenie hornej hranice prehľadávanej oblasti poľa while hh > 0: inxmax = 0 # počiatočná hodnota indexu maxima!!! for i in range(1,hh): # prehľadávanie zvyšnej časti poľa if pole[i]>pole[inxmax]: inxmax = i # nový index maxima v prehľadávanej oblasti hh -= 1 # posunutie hornej hranice prehľadávanej oblasti poľa!!! pole[inxmax], pole[hh] = pole[hh], pole[inxmax] # výmena až teraz (prečo?) Úlohy na precvičenie: napíšte a odlaďte triedenie výberom cez maximá s využitím štandardných funkcií pre zoznamy vytvorte a použite funkciu, ktorá efektívne vypíše k (0 < k len(pole)) najväčších prvkov poľa, vytvorte a použite funkciu, ktorá efektívne vypíše k (0 < k len(pole)) najmenších prvkov poľa, * vytvorte a použite funkciu, ktorá efektívne vypíše k (0 < k len(pole)) rôznych najväčších prvkov poľa, * vytvorte a použite funkciu, ktorá efektívne vypíše k (0 < k len(pole)) rôznych najmenších prvkov poľa, * napíšte a odlaďte triedenie výberom cez minimum a maximum súčasne (otestujte pre polia [3,1,2] a [2,3,1]). Nepovinné príklady rozširujúce učivo o triedení: T.4* Naprogramujte triedenie priamym vkladaním - Insertion sort. Ako už naznačuje názov algoritmu, postupne berieme druhý, tretí, štvrtý až posledný prvok poľa a vkladáme ich na správne miesto vľavo od pôvodnej pozície vkladaného prvku. Správne miesto pre vkladaný prvok je také, že vľavo sú už len menšie čísla a vpravo (po pôvodnú pozíciu) väčšie alebo rovné hodnote vkladaného prvku. Pole je v tejto časti čiastočne utriedené. Napríklad Prvok: 1. 2. 3. 4. 5. Index: 0 1 2 3 4 Pôvodné pole 5 3 4 2 1 2. prvok na svoje miesto 3 5 4 2 1 3.prvok na svoje miesto 3 4 5 2 1 4.prvok na svoje miesto 2 3 4 5 1 5.prvok na svoje miesto 1 2 3 4 5 Všimnite si, že pole je zľava po vkladaný prvok čiastočne utriedené (možno využiť v špecifických úlohách). 4

Jedna z viacerých alternatív: Python - študijný text def insertionsort(pole): Insertion sort zoberie druhý prvok poľa a vloží ho na svoje miesto vľavo, potom tretí prvok poľa a vloží ho na svoje miesto vľavo atď. for i in range(1, len(pole)): # vložiť prvok s indexom 1, potom 2, atď. až s posledným indexom vlozit = pole[i] inxkam = i-1 while inxkam >= 0 and pole[inxkam] > vlozit: pole[inxkam+1] = pole[inxkam] inxkam -= 1 pole[inxkam+1] = vlozit # inxkam je o jednu pozíciu vľavo od miesta, kam treba vložiť vlozit poleintutr = insertionsort(poleint[:]) pole.vypis(poleintutr) Počet prvkov poľa: 30 [58, 22, 61, 14, 18, 83, 12, 86, 5, 35, 89, 98, 31, 86, 8, 19, 99, 52, 76, 68, 65, 83, 86, 62, 20, 89, 81, 69, 61, 89] [5, 8, 12, 14, 18, 19, 20, 22, 31, 35, 52, 58, 61, 61, 62, 65, 68, 69, 76, 81, 83, 83, 86, 86, 86, 89, 89, 89, 98, 99] *Úlohy na precvičenie: napíšte program, ktorý bude vypisovať priebežné výsledky dobiehajúcich pretekárov do cieľa (po zadaní novej hodnoty z klávesnice vypíše utriedené dovtedy vložené hodnoty; počet pretekárov môže byť známy). 5