Alkalmazott modul: Programozás. Programozási tételek, rendezések Giachetta Roberto

Hasonló dokumentumok
Alkalmazott modul: Programozás. Programozási tételek, rendezések. Programozási tételek Algoritmusok és programozási tételek

Bevezetés a programozásba I 3. gyakorlat. PLanG: Programozási tételek. Programozási tételek Algoritmusok

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

Programozási tételek. Dr. Iványi Péter

Adatbázis és szoftverfejlesztés elmélet. Programozási tételek

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Programozási segédlet

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Adatbázis rendszerek Gy: Algoritmusok C-ben

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés. Szekvenciális fájlkezelés Fájlok használata

Térinformatikai algoritmusok Elemi algoritmusok

Bevezetés a programozásba I.

Bevezetés a programozásba I 4. gyakorlat. PLanG: Szekvenciális fájlkezelés

Maximum kiválasztás tömbben

Térinformatikai algoritmusok Elemi algoritmusok

INFORMATIKA javítókulcs 2016

ELEMI PROGRAMOZÁSI TÉTELEK

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

PROGRAMOZÁSI TÉTELEK

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök

Edényrendezés. Futási idő: Tegyük fel, hogy m = n, ekkor: legjobb eset Θ(n), legrosszabb eset Θ(n 2 ), átlagos eset Θ(n).

Algoritmuselmélet 2. előadás

Bevezetés a programozásba I 8. gyakorlat. C++: szövegfolyamok, intelligens tömbök. Adatfolyamok Hibalehetőségek

Rendezések. A rendezési probléma: Bemenet: Kimenet: n számot tartalmazó (a 1,a 2,,a n ) sorozat

9. előadás. Programozás-elmélet. Programozási tételek Elemi prog. Sorozatszámítás Eldöntés Kiválasztás Lin. keresés Megszámolás Maximum.

Egyszerű programozási tételek

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

Programozás alapjai 9.Gy: Struktúra 2.

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

Rendezések. Sergyán Szabolcs Óbudai Egyetem Neumann János Informatikai Kar október 24.

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

10. gyakorlat Tömb, mint függvény argumentum

Hatékonyság 1. előadás

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós február 18. Széchenyi István Egyetem, Gy r

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Felvételi tematika INFORMATIKA

Programozás alapjai. 5. előadás

Programozási módszertan. Mohó algoritmusok

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs

1. numere.txt n (1 n 10000) n növekvő kilenc a) Pascal/C++ Például: NUMERE.TXT

Programozás I. Egyszerű programozási tételek. Sergyán Szabolcs

Számsorozatok (1) First Prev Next Last Go Back Full Screen Close Quit

Információk. Ismétlés II. Ismétlés. Ismétlés III. A PROGRAMOZÁS ALAPJAI 2. Készítette: Vénné Meskó Katalin. Algoritmus. Algoritmus ábrázolása

Szövegek C++ -ban, a string osztály

BBTE Matek-Infó verseny mintatételsor Informatika írásbeli vizsga

1. Alapfogalmak Algoritmus Számítási probléma Specifikáció Algoritmusok futási ideje

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós szeptember 27. Széchenyi István Egyetem, Gy r

Programozás I. Metódusok C#-ban Egyszerű programozási tételek. Sergyán Szabolcs

Véletlen sorozatok ellenőrzésének módszerei. dolgozat

Bevezetés az informatikába

// keressük meg a legnagyobb faktoriális értéket, ami kisebb, // mint százmillió

Programozás I. Matematikai lehetőségek Műveletek tömbökkel Egyszerű programozási tételek & gyakorlás V 1.0 OE-NIK,

1. Jelölje meg az összes igaz állítást a következők közül!

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

Webprogramozás szakkör

2. Milyen értéket határoz meg az alábbi algoritmus, ha A egy vektor?. (2 pont)

Programozás C nyelven 5. ELŐADÁS. Sapientia EMTE

Multihalmaz, intervallumhalmaz

Objektum Orientált Programozás VII.

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

A félév során előkerülő témakörök

Programozás(A szakirány) II. beadandó feladat Farkas András HP6S15 1. csoport Veszprémi Anna / Hudoba Péter

Rekurzív algoritmusok

INFORMATIKA tétel 2019

BME MOGI Gépészeti informatika 5.

Programozás Minta programterv a 1. házi feladathoz 1.

Specifikáció. B logikai formula, a bemeneti feltétel, K logikai formula, a kimeneti feltétel, A az algoritmus, amelyre az állítás vonatkozik.

Algoritmusok és adatszerkezetek gyakorlat 07

INFORMATIKA tétel 2018

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

.Net adatstruktúrák. Készítette: Major Péter

Algoritmusok bonyolultsága

BABEŞ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR BBTE Matek-Infó verseny 1. tételsor INFORMATIKA írásbeli. A versenyzők figyelmébe:

Számjegyes vagy radix rendezés

Haladó rendezések. PPT 2007/2008 tavasz.

14. Mediánok és rendezett minták

Összetett programozási tételek

Gyakorló feladatok Gyakorló feladatok

2018, Diszkrét matematika

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

Algoritmizálás, adatmodellezés tanítása 1. előadás

Bonyolultságelmélet. Thursday 1 st December, 2016, 22:21

BME MOGI Gépészeti informatika 4.

15. tétel. Adatszerkezetek és algoritmusok vizsga Frissült: január 30.

Programozás Minta programterv a 2. házi feladathoz 1.

Bevezetés a programozásba. 5. Előadás: Tömbök

INFORMATIKAI ALAPISMERETEK

Bevezetés a programozásba I.

Algoritmusok és adatszerkezetek I. 1. előadás

Rendezések. Összehasonlító rendezések

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Alkalmazott modul: Programozás Programozási tételek, rendezések 2015 Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto

Algoritmusok és programozási tételek Az egyszerű, sorozatokra alkalmazott algoritmusokat nevezzük programozási tételeknek, ezek a következők: összegzés, számlálás lineáris keresés maximum keresés, feltételes maximumkeresés bináris keresés A programozási tételek absztrakt módon fogalmazzuk meg, majd a feladatnak megfelelő átalakításokkal alkalmazzuk az absztrakt megfogalmazást egész értékű sorozatokon fogalmazzuk meg, de lehetne általánosítani ELTE IK, Alkalmazott modul: Programozás 2

Összegzés Az összegzés programozási tétele lehetővé teszi tetszőleges sorozat (aa 1,, aa nn ) adott függvény (ff) szerint vett értékének összesítését (ssssss) nn ssssss = ff(aa ii ) ii=1 az összegzés egy ciklusban történik, az összeget egy külön változóhoz adjuk hozzá minden lépésben, amelyet egy kezdeti értékkel inicializálunk általában az összegző művelet az összeadás, ekkor az összeg változó 0-ról indul a függvény sokszor az identitás, de lehet nagyon összetett is ELTE IK, Alkalmazott modul: Programozás 3

Összegzés Absztrakt leírás: AA = aa Z nn, ssssss Z ff: Z Z QQ = jj 1.. nn : aa jj = aa jj nn RR = QQ ssuuuu = jj=1 ff(aa jj ) ssssss 0, ii 1 ii nn ssssss ssssss + ff(aa jj ) ii ii + 1 ELTE IK, Alkalmazott modul: Programozás 4

Összegzés Megvalósítás: int a[n]; // feldolgozandó sorozat int sum; // összeg változó // a sorozat elemei értéket kapnak sum = 0; // az összeget kinullázzuk for (int i = 0; i < n; i++) { sum = sum + f(a); // f tetszőleges egész függvény // az eredmény a sum változóban található ELTE IK, Alkalmazott modul: Programozás 5

Összegzés Feladat: Adjuk meg az első n természetes szám összegét. ehhez az összegzés tételére van szükségünk, a forrás és az eredmény típusa egész, a művelet az összegzés, a kezdőérték nulla az értéket nem kell külön beolvasnunk, és nem kell külön eltárolnunk, ezek adott konstansok, csupán az intervallum végét, azaz n értékét kérjük be a felhasználótól egy számláló ciklusra lesz szükségünk, amely elmegy 1-től az n értékéig ELTE IK, Alkalmazott modul: Programozás 6

Összegzés Megoldás: int main(){ int sum = 0, n; // inicializálás cout << "Kérem n értékét: "; cin >> n; // beolvasás for (int i = 1; i <= n; i++) // összegzés sum += i; cout << "Az első " << n << " szám összege: " << sum << endl; // eredmény kiírása return 0; ELTE IK, Alkalmazott modul: Programozás 7

Számlálás A számlálás programozási tétele lehetővé teszi, hogy tetszőleges (aa 1,, aa nn ) sorozatban megszámoljuk egy adott (logikai) felvételt (ββ) teljesítő elemek számát (cc) nn cc = ii=1 ββ(aa ii ) a feltétel tetszőleges logikai értékű függvény lényegében az összegzés egy speciális esetét végezzük, ahol vagy 1-t, vagy 0-t adunk hozzá az eddigi összeghez, függően a feltétel teljesülésétől ezt a végrehajtásban elágazás segítségével valósítjuk meg 1 ELTE IK, Alkalmazott modul: Programozás 8

Összegzés Absztrakt leírás: AA = aa Z nn, cc N ββ: Z LL QQ = jj 1.. nn : aa jj = aa jj nn RR = QQ cc = jj=1 1 ββ(aa ii ) cc 0, ii 1 ii nn ββ(aa ii ) cc cc + 1 ii ii + 1 SSSSSSSS ELTE IK, Alkalmazott modul: Programozás 9

Összegzés Megvalósítás: int a[n]; // feldolgozandó sorozat int c; // számláló változó // a sorozat elemei értéket kapnak c = 0; // az számlálót kinullázzuk for (int i = 0; i < n; i++) { if (beta(a[i])) // ha teljesül a feltétel c++; // növeljük a számlálót // eredmény a c változóban található ELTE IK, Alkalmazott modul: Programozás 10

Számlálás Feladat: Generáljuk 100 véletlen számot 1 és 10 között, és számoljuk meg, hány páratlan van közöttük. használjuk a számlálás tételét, ahol a páratlanság biztosítja a feltételt (oszthatóságot a moduló segítségével ellenőrizhetünk, 2-vel osztva 1-t ad maradékul) a számot 0-9 közé generáljuk, majd hozzáadunk egyet szükségünk lesz egy számláló ciklusra Megoldás: int main(){ srand(time(0)); // véletlen generátor indítás int nums[100]; // számok tömbje ELTE IK, Alkalmazott modul: Programozás 11

Számlálás Megoldás: for (int i = 0; i < 100; i++) // generálás nums[i] = rand() % 10 + 1; // 1 és 10 közötti szám int c = 0; // inicializálás for (int i = 0; i < 100; i++) // számlálás if (nums[i] % 2 == 1) // ha páratlan a szám c++; cout << "100 véletlen számból " << c << " volt páratlan. " << endl; // kiírás return 0; ELTE IK, Alkalmazott modul: Programozás 12

Lineáris keresés A lineáris keresés programozási tétele segítségével megállapíthatjuk, hogy van-e egy sorozatban egy adott feltételt teljesítő elem, és amennyiben több van, melyik az első ilyen elem. a teljesüléshez szükségünk van egy logikai változóra (ll), és megadhatjuk magát az értéket, vagy a helyét (iiiiii) amennyiben már teljesült a feltétel, akkor nincs értelme végignézni a további értékeket, hiszen a teljesülést nem befolyásolják ezért a ciklust korábban is terminálhatjuk úgy, hogy a logikai változót is bevesszük a ciklusfeltételbe ELTE IK, Alkalmazott modul: Programozás 13

Lineáris keresés Absztrakt leírás: AA = aa Z nn, iiiiii N, ll LL ββ: Z LL QQ = jj 1.. nn : aa jj = aa jj RR = QQ ll = jj 1.. nn : ββ aa jj ll iiiiii 1.. nn ββ aa iiiiii jj 1.. iiiiii 1 : ββ aa jj ll, ii 1 ll ii nn ll ββ aa ii, iiiiii ii ii ii + 1 ELTE IK, Alkalmazott modul: Programozás 14

Lineáris keresés Megvalósítás: int a[n]; // feldolgozandó sorozat bool l = false; // teljesülés változója int ind; // keresett hely változója // a sorozat elemei értéket kapnak for (int i = 0; i < n &&!l; i++) // a logikai érték is bekerül a feltételbe { l = beta(a[i]) // ha teljesül a feltétel ind = i; // növeljük a számot // eredmény az l és ind változókban található ELTE IK, Alkalmazott modul: Programozás 15

Lineáris keresés Feladat: 10 napon át megmértük a hőmérsékletet, mértünk-e fagypont alatti értéket, és ha igen, hányadik napon először. valós értékekkel dolgozunk, ugyanakkor az érték helye egész lesz lineáris keresést alkalmazunk, a feltétel a negatív érték Megoldás: int main(){ float t; // aktuális napi hőmérséklet bool l = false; int ind; ELTE IK, Alkalmazott modul: Programozás 16

Lineáris keresés Megoldás: for (int i = 1; i <= 100 &&!l; i++){ cin >> t; // napi hőmérséklet beolvasása l = t < 0; // feltétel ellenőrzés ind = i; // eredmény függvényében való kiírás if (l) // ha teljesült cout << "A(z) " << ind << ". napon mértünk először negatív értéket. " << endl; else // ha nem teljesült a feltétel cout << "Nem mértünk mínusz értéket." << endl; return 0; ELTE IK, Alkalmazott modul: Programozás 17

Maximumkeresés Egy sorozat (adott szempont szerinti) maximumát a maximumkeresés programozási tételével állapíthatjuk meg. megadja a maximum értékét, illetve helyét mindig összehasonlítjuk az új elemet a sorozat eddigi részének maximumával, és ha nagyobb nála, akkor ő lesz az új maximum ehhez a maximum értéket kezdetben valamilyen extremális értéktől indíthatjuk el (pl. ha csak pozitív számok vannak, akkor 0-tól), vagy rögtön ráállítjuk a sorozat első elemére, így a sorozat második elemétől indul a ciklus a tétel könnyen átfogalmazható minimumra ELTE IK, Alkalmazott modul: Programozás 18

Maximumkeresés Absztrakt leírás: AA = aa Z nn, iiiiii N, mmmmmm Z QQ = nn 1 jj 1.. nn : aa jj = aa jj RR = QQ mmmmmm, iiiiii = max aa jj iiiiii 1, mmmmmm aa 1, ii 2 ii nn aa ii > mmmmmm iiiiii i, mmmmmm aa ii SSSSSSSS ii ii + 1 ELTE IK, Alkalmazott modul: Programozás 19

Maximumkeresés Megvalósítás: int a[n]; // feldolgozandó sorozat // a sorozat elemei értéket kapnak int ind = 0, max = a[0]; // maximum hely és érték változók, az első // elemre állnak for (int i = 0; i < n; i++) { if (max < a[i]){ // ha nagyobb elemet találunk ind = i; // újra beállítjuk őket max = a[i]; // eredmény az ind és max változókban található ELTE IK, Alkalmazott modul: Programozás 20

Maximumkeresés Feladat: Minden nap megmértük a hőmérséklet egészen addig, amíg fagypont alá nem estek. Keressük meg az addig tartó tartomány legnagyobb értékét, és hogy hányadik. maximumkeresést alkalmazunk előtesztelő ciklusban dolgozunk, amely 0-nál kisebb érték esetén megáll (számolnunk kell a napokat is, hogy megállíthassuk a maximum helyét) Megoldás: int main(){ float t; // aktuális napi hőmérséklet cin >> t; // első érték beolvasása int ind = 1, max = t, i = 1; // inicializálás ELTE IK, Alkalmazott modul: Programozás 21

Maximumkeresés Megoldás: cin >> t; // beolvassuk a következő értéket while (t >= 0) { // amíg nem lesz negatív az érték i++; // növeljük a sorszámot if (t > max) { // új maximum ind = i; max = t; cin >> t; // beolvassuk a következő értéket cout << "A maximum: " << max << ", a(z) " << ind << ". napon mértünk. " << endl; return 0; ELTE IK, Alkalmazott modul: Programozás 22

Feltételes maximumkeresés A maximumkeresés tételének azon változatát, ahol csak a sorozat bizonyos elemei között keresünk maximumot, feltételes maximumkeresésnek nevezzük adott egy feltétel, amelyet a sorozat minden elemére megvizsgálunk, ha az elem nem teljesíti a feltételt, akkor nem teszünk semmit nem állíthatjuk rögtön az első elemre a maximumot, hanem csak az első olyan elemre, amely teljesíti ezt a feltételt nem garantált, hogy van olyan eleme a sorozatnak, ami teljesíti a feltételt, ezért egy logikai értékkel jeleznünk kell, hogy találtunk-e ilyet ELTE IK, Alkalmazott modul: Programozás 23

Feltételes maximumkeresés Absztrakt leírás: AA = aa Z nn, iiiiii N, mmmmmm Z, ll LL ββ: Z LL QQ = nn 1 jj 1.. nn : aa jj = aa jj RR = QQ ll, mmmmmm, iiiiii = max ββ aa jj aa jj ll, iiiiii ii, mmmmmm aa ii ll, ii 1 ii nn ββ aa ii ll ββ aa ii ll ββ aa ii aa > mmmmmm iiiiii ii, mmmmmm aa ii ii ii + 1 SSSSSSSS SSSSSSSS ELTE IK, Alkalmazott modul: Programozás 24

Feltételes maximumkeresés Megvalósítás: int a[n]; // feldolgozandó sorozat // a sorozat elemei értéket kapnak bool l = false; // kezdetben nincs a feltételnek eleget tevő // elem for (int i = 0; i < n; i++) { if (beta(a[i]) &&!l){ // első ilyen elem l = true; // mindent be kell állítanunk ind = i; max = a[i]; ELTE IK, Alkalmazott modul: Programozás 25

Feltételes maximumkeresés Megvalósítás: if (beta(a[i]) && max < a[i]){ // ha már volt ilyen elem, és az aktuális, // feltételt teljesítő elem nagyobb nála ind = i; max = a[i]; // újra beállítjuk az indexet és // maximumot // eredmény az l, ind és max változókban található ELTE IK, Alkalmazott modul: Programozás 26

Példa Feladat: Olvassunk be 10 szót a bemenetről, és adjuk meg a legrövidebb, legalább 10 hosszú szavat. használjunk feltételes minimumkeresést, amelynek feltétele, hogy a szó legalább 10 hosszú a szavak hosszát hasonlítjuk össze, a legrövidebbet keressük Megoldás: int main(){ string word; // beolvasandó szó bool l = false; int ind; string min; ELTE IK, Alkalmazott modul: Programozás 27

Példa Megoldás: for (int i = 1; i <= 10; i++) { cin >> word; // szó beolvasása if (word.length() >= 10 &&!l){ // hossz ellenőrzése l = true; ind = i; min = word; if (word.length() >= 10 && word.length() < min.length()) { ind = i; min = word; ELTE IK, Alkalmazott modul: Programozás 28

Példa Megoldás: if (l){ // találtunk legalább 10 hosszú szavat cout << "A legrövidebb megfelelő szó " << min << " volt, amelyet " << ind << "-ként adtunk meg." << endl; else { // nem találtunk cout << "Nem volt megfelelő szó." << endl; return 0; ELTE IK, Alkalmazott modul: Programozás 29

Bináris keresés Amennyiben egy értéket keresünk a bemenő sorozatban, és annak elemei növekvően (vagy csökkenően) rendezettek, lehetőségünk van bináris (logaritmikus) keresést használni a bináris keresés nem sorrendben dolgozza fel a bemenetet, hanem felhasználja a sorozat rendezettségét vegyünk egy elemet a sorozatból, ha az a keresett elem, akkor végeztünk, ha kisebb, mint a keresett, akkor csak az utána lévő tartományban lehet a keresendő elem, ha pedig nagyobb, akkor az előtte lévő tartományban mindig felezzük a tartományt, és a középső elemet ellenőrizzük le, nem egyezés esetén vagy az első felét, vagy a második felét vesszük a tartománynak, és így tovább ELTE IK, Alkalmazott modul: Programozás 30

Bináris keresés Pl. keressük a 73-as elemet az alábbi sorozatban: 03 10 18 21 39 40 51 73 76 81 93 itt felezünk, a 40 kisebb, mint a 73, ezért következő lépésben a tartomány második felét vizsgáljuk 03 10 18 21 39 40 51 73 76 81 93 03 10 18 21 39 40 51 73 76 81 93 03 10 18 21 39 40 51 73 76 81 93 ELTE IK, Alkalmazott modul: Programozás 31

Bináris keresés Ez az algoritmus hatékonyabb, mint a lineáris keresés, mivel esetenként sok elemet is át tud ugrani egyszerre A tartományt úgy szabályozzuk, hogy mindig nyilvántartjuk annak alsó, illetve felső határát, és ezt állítjuk a középső elem függvényében Az algoritmus addig halad, amíg meg nem találjuk az elemet, vagy üres nem lesz a tartomány (az alsó határ nagyobb, mint a felső határ) Csökkenő értékekkel is megfogalmazható, csak fordítani kell a relációkon ELTE IK, Alkalmazott modul: Programozás 32

Bináris keresés Absztrakt leírás: AA = aa Z nn, iiiiii N, ll LL, h Z QQ = jj 1.. nn : aa jj = aa jj jj 1.. nn 1 : aa jj aa jj+1 RR = QQ ll = jj 1.. nn : aa jj = h ll iiiiii 1.. nn aa iiiiii = h aa iiiiii > h hiiiiiii iiiiii 1 llllllll 1, hiiiiiii nn, ll ll llllllll hiiiiiii iiiiii llllllll + hiiiiiii 2 aa iiiiii < h llllllll iiiiii + 1 aa iiiiii = h ll ELTE IK, Alkalmazott modul: Programozás 33

Bináris keresés Megvalósítás: int a[n]; // feldolgozandó monoton növő sorozat int h; // keresett érték // a sorozat és keresett érték megadása bool l = false; in lowb = 0, highb = n-1; // kezdő határok while (!l && lowb <= highb) { int ind = (lowb + highb) / 2; // középre állás if (a[i] < h) highb = ind 1; if (a[i] > h) lowb = ind + 1; if (a[i] == h) l = true; // ha megtaláltuk ELTE IK, Alkalmazott modul: Programozás 34

Rendezések Típusai A rendezések feladata egy adott sorozat elemeinek növekvő, vagy csökkenő sorrendbe állítása az egy elemű sorozat mindig rendezett, csak a nagyobb számúakat kell rendezni A rendezéseknek két típusát tartjuk nyilván: összehasonlító: az elemek összehasonlításával állapítja meg az egymáshoz viszonyított sorrendjüket, ez önmagában a sorozat ismeretéve levégezhető nem összehasonlító: abszolút sorrendiséget állapít meg kategóriák, és darabszámok megállapításával, amihez az elemeken felül további információk szükségesek ELTE IK, Alkalmazott modul: Programozás 35

Rendezések Kiválasztásos rendezés A kiválasztásos rendezés kiválasztja a rendezetlen részsorozat minimális (vagy maximális) elemét, és azt a rendezett részsorozat elé (vagy mögé) helyezi kicseréli azt a rendezetlen részsorozat első, vagy utolsó elemével, és növeli a rendezett részsorozat hosszát a rendezetlen részsorozat kezdetben az egész sorozat, majd folyamatosan csökken egy ciklussal növeljük a rendezett részsorozat hosszát, ezt elég az utolsó előtti elemig futtatni (hiszen az egy elemű sorozat mindig rendezett) a kiválasztáshoz szükség van egy minimum-, vagy maximumkeresésre az adott részsorozatban ELTE IK, Alkalmazott modul: Programozás 36

Rendezések Kiválasztásos rendezés Pl.: 10 03 09 04 15 04 12 kiválasztjuk a 3-at a rendezetlen részsorozatból, és cserélünk 03 10 09 04 15 04 12 a rendezett részsorozat hossza nő 03 04 09 10 15 04 12 03 04 04 10 15 09 12 03 04 04 09 15 10 12 03 04 04 09 10 15 12 03 04 04 09 10 12 15 ELTE IK, Alkalmazott modul: Programozás 37

Rendezések Kiválasztásos rendezés Absztrakt leírás: AA = aa Z nn, iiiiii N, ll LL, h Z QQ = jj 1.. nn : aa jj = aa jj RR = aa 1,, aa nn = aa 1,, aa nn jj 1.. nn 1 : aa jj aa jj+1 jj 1 jj nn 1 iiiiii, mmmmmm mmiiiisssssssssss(aa[jj nn]) ssssssss(aa iinnnn, aa jj ) jj jj + 1 ELTE IK, Alkalmazott modul: Programozás 38

Rendezések Kiválasztásos rendezés Megvalósítás: int a[n]; // feldolgozandó monoton növő sorozat // a sorozat megadása for (int j = 0; j < n 1; j++){ int ind = minsearch(a, j, n); // manimumkeresés a résztömbön int temp = a[ind]; // két elem cseréje a[ind] = a[j]; a[j] = temp; ELTE IK, Alkalmazott modul: Programozás 39

Rendezések Kiválasztásos rendezés Feladat: Olvassunk be 10 sort a bemenetről, és rendezzük őket hossz szerint növekvő sorrendbe. használjunk maximumkiválasztásos rendezést a sor hosszára mivel a sorokat többször is fel kell dolgozni, mindenképpen el kell tárolnunk őket egy tömbbe Megoldás: int main(){ string lines[10]; // a sorok for (int i = 0; i < 10; i++) // beolvasás getline(cin, lines[i]); // soronként ELTE IK, Alkalmazott modul: Programozás 40

Rendezések Maximumkeresés Megoldás: for (int j = 0; j < 9; j++){ // rendezés int ind = j; // maximumkeresés for (int i = j; i < 10; i++){ if (lines[i].length() > lines[ind].length()){ ind = i; string temp = lines[ind]; // elemek cseréje lines[ind] = lines[j]; lines[j] = temp; return 0; ELTE IK, Alkalmazott modul: Programozás 41

Rendezések Buborékrendezés A buborékrendezés összehasonlít egy elemet a rákövetkezővel, és amennyiben rossz sorrendben vannak, megcseréli őket így az elemek felbuborékolódnak a rendezetlen részsorozat végére egy külső ciklus szabályozza, hogy hány rendezetlen elem van még a sorozatban (ez a második elemig halad visszafelé, hiszen az egy hosszú sorozatot már nem kell rendezni) a belső ciklus végighalad a rendezetlen részsorozaton az elejétől annak utolsó előtti eleméig, ellenőrzi, hogy az elemek rossz sorrendben vannak-e, és amennyiben igen, megcseréli őket ELTE IK, Alkalmazott modul: Programozás 42

Rendezések Buborékrendezés Pl.: 10 03 09 04 15 04 12 03 10 09 04 15 04 12 belső ciklus indul ha rossz a sorrend, cserél 03 09 10 04 15 04 12 03 09 04 10 15 04 12 03 09 04 10 15 04 12 03 09 04 10 04 15 12 03 09 04 10 04 12 15 belső ciklus vége, a külső ciklus lép egyet vissza ELTE IK, Alkalmazott modul: Programozás 43

Rendezések Buborékrendezés Absztrakt leírás: jj nn jj 2 ii 1 ii < jj aa ii > aa ii+1 ssssssss(aa ii, aa ii+1 ) ii ii + 1 jj jj 1 SSSSSSSS ELTE IK, Alkalmazott modul: Programozás 44

Rendezések Buborékrendezés Megvalósítás: int a[n]; // feldolgozandó monoton növő sorozat // a sorozat megadása for (int j = n - 1; j > 0; j--){ // külső ciklus for (int i = 0; i < j; i++){ // belső ciklus if (a[i] > a[i + 1]){ // ha rossz a sorrend int temp = a[ind]; // két elem cseréje a[ind] = a[j]; a[j] = temp; ELTE IK, Alkalmazott modul: Programozás 45