Programozás tételek I. Elem programozás tételek (Sorozathoz érték redelése)
Olya algortmusokat tárgyaluk meg, amelyek a programozás sorá redszerese előforduló feladatok megoldására kész választ adak. Ezeket az algortmusokat programozás tételekek hívják. A programozás tételek azok az építőkövek, amelyek egy program létrehozása sorá mdutala előfordulak. I / 1. Eldötés Általáos feladat: Adott egy elemű sorozat. Állapítsuk meg, va-e bee T tulajdoságú elem! T függvéy a H halmazbél elemekhez redel logka gaz, vagy hams értéket. A sorozatot az elemű X vektorba tároljuk, mely elemek H halmazba tartozak. Bemeet N, X H, T : H L előfeltétel cs Voltlye= (1 ) : T ( X ( )) Kmeet Voltlye L Eljárás Eldötés :=1 Cklus amíg és em T(X()) :=+1 voltlye:=( ) Eljárás vége. Példa: Egy hóapo keresztül mde ap délbe megmértük egy folyó vízállását. Ha 200cm-él magasabb a vízállás, akkor a folyó árad. Állapítsuk meg, volt-e áradás a hóapba! Bemeet előfeltétel cs N, X R, gaz hax ( ) > 200 T : hams külöbe Voltlye= (1 ) : X ( ) > 200 Eljárás Eldötés :=1 Cklus amíg és em (X()>200) :=+1 voltlye:=( ) Eljárás vége. Kmeet Voltlye L
program magasvz; type valostomb=array[1..35]of real; var, :teger; Voltlye:Boolea; X:valostomb; procedure be; repeat wrtel('kerem a meresek szamat!'); readl(); utl ( (<=35) ad (>0) ); for :=1 to do ; wrtel('kerem az',,'. ap vzallasat'); readl(x[] ); procedure utofeltetel; :=1; whle ((<=) ad (ot (X[]>200))) do c(); procedure k; voltlye:=(<=); f voltlye the wrtel('aradt') else wrtel('em aradt'); be; utofeltetel; k; ed.
I / 2. Kválasztás Általáos feladat: Adott egy elemű sorozat. Állapítsuk meg, melyk sorszámú elem T tulajdoságú! T függvéy a H halmazbél elemekhez redel logka gaz, vagy hams értéket. Bemeet N, X H, T : H L előfeltétel (1 ) : T( X ( )) sorsz= (1 sorsz ) ést ( X ( sorsz)) Eljárás kválasztás :=1 Cklus amíg ( és em T(X()) ) :=+1 sorsz:= Eljárás vége. Kmeet sorsz N Példa A maxmum 35 fős testvérosztály láya között va kékszemű. Azt szereték megtud, melyk láy az. A láyok szeme szíét egy olya tömbbe tároljuk, amek mde eleme egy karakter. Ez a karakter a szemszí kezdőbetűje. Bemeet N, X karakter, gaz hax ( ) = ' k ' T : hams külöbe előfeltétel (1 ) : ( X ( ) = ' k ') sorsz= (1 sorsz ) és X ( sorsz) = ' k ' Eljárás kválasztás :=1 Cklus amíg ( és em (X()= k ) :=+1 sorsz:= Eljárás vége. Kmeet sorsz N
program kek_a_szeme; uses crt; type karaktertomb=array[1..35]of char; var,, sorsz:teger; X:karaktertomb; procedure be; repeat wrtel('kerem a testverosztaly letszamat!'); readl(); utl ( (<=35) ad (>0) ); for :=1 to do ; wrtel('kerem az',,'. lay szeme szet'); (X[]):=readkey; wrtel(x[]); procedure utofeltetel; :=1; whle ((<=) ad (ot (X[]='k'))) do c(); sorsz:=; procedure k; wrtel(sorsz, '. lay kekszemu'); be; utofeltetel; k; ed.
I / 3. Keresés I / 3.1. Leárs keresés (keresés redezetle sorozatba) Általáos feladat: Adott egy elemű sorozat. Állapítsuk meg, va-e bee T tulajdoságú, és ha va, akkor melyk elem az! Bemeet N, X H, T : H L előfeltétel cs Kmeet Példa Voltlye= (1 ) : T ( X ( )) sorsz= (1 sorsz ) ést ( X ( sorsz)) Voltlye L sorsz N Eljárás keresés :=1 Cklus amíg és em T(X()) :=+1 voltlye:=( ) Ha voltlye akkor sorsz:= Eljárás vége. A maxmum 35 fős testvérosztály láya között em tudjuk va-e kékszemű. Azt szereték megtud, hogy va-e és ha va, akkor melyk láy az. A láyok szeme szíét egy olya tömbbe tároljuk, amek mde eleme egy karakter. Ez a karakter a szemszí kezdőbetűje. Bemeet előfeltétel cs N, X karakter, gaz hax ( ) = ' k ' T : hams külöbe Voltlye= (1 ) : X ( ) = ' k ' sorsz= (1 sorsz ) és X ( sorsz) = ' k ' Eljárás keresés :=1 Cklus amíg ( és em (X()= k ) :=+1 voltlye:=( ) Ha voltlye akkor sorsz:= Eljárás vége. Kmeet sorsz N
program kek_e_a_szeme; uses crt; type karaktertomb=array[1..35]of char; var,, sorsz:teger; Voltlye:Boolea; X:karaktertomb; procedure be; repeat wrtel('kerem a testverosztaly letszamat!'); readl(); utl ( (<=35) ad (>0) ); for :=1 to do ; wrtel('kerem az',,'. lay szeme szet'); (X[]):=readkey; wrtel(x[]); procedure utofeltetel; :=1; whle ((<=) ad (ot (X[]='k'))) do c(); voltlye:=(<=); procedure k; f voltlye the sorsz:=; wrtel(sorsz, '. lay kekszemu'); ed else wrtel('ncs kekszemu'); be; utofeltetel; k; ed.
I / 3.2. Logartmkus keresés (keresés redezett sorozatba) Általáos feladat: Adott egy elemű redezett X() sorozat és egy keresett eleme (Y). Keressük a sorozatba az adott Y elemet. Vzsgáljuk meg első lépésbe a sorozat középső elemét! ha ez a keresett elem, akkor késze vagyuk. Ha a keresett elem ksebb, akkor csak a megelőzőek között lehet, tehát a továbbakba a sorozatak arra a részére kell alkalmaz. Ha a keresett elem eél agyobb, akkor pedg ugyaeze elv alapjá a sorozat ezt követő részére. Ez a megoldás az utófeltételt s szgorítja. Bemeet előfeltétel Kmeet N, X H : H L Y H : keresettelem X ( ) X ( + 1) (1 ) Voltlye= (1 ) : X ( ) = Yés voltlye (1 sorsz ) ésx ( sorsz) = Y (1 sorsz) : X ( ) Yés ( sorsz ) : X ( ) Y Voltlye L sorsz N eljárás keresés E:=1; U:=N Cklus k:=t((e+u)/2) { (E+U)/2 egészrésze } elágazás Y<X(k) eseté: U:=k-1 Y>X(k) eseté: E:=k+1 elágazás vége amíg E U és X(k) Y voltlye:=e u Ha voltlye akkor sorsz:=k Eljárás vége. program logartmkus_kereses; {most éppe a 10-es számot keressük} uses crt; cost maxn=35; Ttulajdosagu='A 10-es szám'; type elemtpus=teger; TombTpus=array[1..maxN]of elemtpus; var,, sorsz:teger; E,K,U:teger; Voltlye:Boolea; X:TombTpus; procedure be; repeat wrtel('háy adatot dolgozuk fel? '); readl(); utl [1..maxN] ;
:=1; wrte('kerem a(z) ',,'. számot '); Read(X[]); for :=2 to do ; repeat {előfeltétel: redezett sorozat!!!} wrte('kerem a(z) ',,'. számot '); Read(X[]); f X[]<X[-1] the wrtel('az előzőél agyobbat!') utl X[]>=X[-1] procedure utofeltetel; E:=1;U:=N; K:=truc((E+U)/2); repeat K:=truc((E+U)/2); wrtel(' K= ',K,' E= ',E,' U= ',U); f 10 < X[K] the U:=K-1; wrtel('közepétől balra lehet U:=K-1 [(E+U)/2]'); f 10 > X[K] the E:=K+1; wrtel('közepétől jobbra lehet E:=K+1 [(E+U)/2]' ); utl ot (((E<=U) ad ((X[k]) <>10))); voltlye:=(e<=u); procedure k; f voltlye the sorsz:=k; wrtel(k, '. ',Ttulajdosagu); ed else wrtel('ncs ',Ttulajdosagu); clrscr; be; utofeltetel; k; readkey; ed.
I / 3.3. Vsszalépéses keresés A vsszalépéses keresés ( backtrack ) a problémamegoldás ge széles területé alkalmazható algortmus, amelyek léyege a feladat megoldásáak megközelítése redszeres próbálgatással. Néha ez a legjobb megoldás! Adott N sorozat, amelyek redre M(1), M(2),...M(N) elemszámúak. K kell választa mdegykből egy-egy elemet úgy, hogy az egyes sorozatokból való választások másokat befolyásolak. Ez egy boyolult keresés feladat, amelybe egy adott tulajdosággal redelkező szám N-est kell megad úgy, hogy e kellje az összes lehetőséget véggéz. Először megpróbáluk az első sorozatból kválaszta egy elemet, ezutá a következőből, ezt addg csáljuk, amíg választás lehetséges. X() jelölje az. sorozatból kválasztott elem sorszámát! Ha még em választottuk, akkor értéke 0 lesz. Ha cs jó választás, akkor vsszalépük az előző sorozathoz, s megpróbáluk abból egy másk elemet választa. Vsszalépésél természetese töröl kell a választást abból a sorozatból, amelykből vsszalépük. Az eljárás akkor ér véget, ha mde sorozatból skerült választa, vagy pedg a vsszalépések sokasága utá már az első sorozatból sem lehet újabb elemet választa (ekkor a feladatak cs megoldása). Eljárás: :=1 : X():=0 Cklus amíg >= 1 és <= N Ha VAN JÓ ESET() akkor :=+1 külöbe X():=0 : :=-1 VAN:=(>N) Eljárás vége. VAN JÓ ESET(): Cklus X():=X()+1 amíg X()<=M() és ROSSZ ESET(,X() ) VAN JÓ ESET:=(X()<=M()) Eljárás vége. ROSSZ ESET(,X() ): j:=1 Cklus amíg j < és (j,x(j)) em zárja k (,X())-t j:=j+1 ROSSZ ESET:=(j < ) Eljárás vége.
I / 4. Sorozatszámítás (kevésbé általáosa csak az összegzésre szűkítve) Feladat: Adott egy elemű számsorozat. Számoljuk k az elemek összegét! A sorozatot az elemű X vektorba tároljuk, melyek eleme H halmazba tartozak. Bemeet N, előfeltétel cs Kmeet X H összeg = = 1 Összeg H X ( ) Eljárás Sorozatszámítás összeg:=0 Cklus =1-től -g Összeg:=Összeg+X() Eljárás vége. Példa: Egy héte keresztül feljegyeztük egy tömbbe, egy vrágkertészetbe az egy ap kyílt vrágok számát. Adjuk meg, a vzsgált dőszak alatt összese mey vrág yílt k Bemeet, előfeltétel cs Kmeet N X N összeg = Összeg N = 1 X ( ) Eljárás Sorozatszámítás összeg:=0 Cklus =1-től -g Összeg:=Összeg+X() Eljárás vége.
program osszegzes; uses crt; type egesztomb=array[1..7]of teger; var,, osszeg:teger; X:egesztomb; procedure be; repeat wrtel('kerem a vzsgalt apok szamat'); readl(); utl ( (<=7) ad (>0) ); for :=1 to do ; wrtel('kerem az',,'.apo ylt vragok szamat'); read(x[]); procedure utofeltetel; osszeg:=0; for :=1 to do osszeg:=osszeg+x[]; procedure k; wrtel(osszeg, ' db vrag ylt osszese.'); be; utofeltetel; k; ed.
I / 5. Megszámlálás Feladat: Adott egy elemű számsorozat. Számoljuk meg, háy darab T tulajdoságú elem va a sorozat eleme között. A sorozatot az elemű X vektorba tároljuk, melyek eleme H halmazba tartozak. Bemeet N, X H, T : H L előfeltétel cs Kmeet DB= = 1 χ ( X( ) ) 1, hattulajdoságúx ( ) χ 0, külöbe DB N Eljárás Megszámlálás DB:=0 Cklus =1-től -g Ha T(X()) akkor DB:=DB+1 Eljárás vége. Példa: Adott db egész szám (1< 10). Számoljuk meg, háy darab páros szám va köztük Bemeet előfeltétel cs Kmeet N, X N, gaz hax ( ) mod 2= 0 T : hams külöbe DB= = 1 χ ( X( ) ) 1, hattulajdoságúx ( ) χ 0, külöbe DB N Eljárás Megszámlálás DB:=0 Cklus =1-től -g Ha X ( ) mod 2= 0 akkor DB:=DB+1 Eljárás vége.
program megszamlalas; uses crt; type egesztomb=array[1..10]of teger; var,, db:teger; X:egesztomb; procedure be; repeat wrtel('kerem a sorozat elemszamat'); readl(); utl ( (<=10) ad (>0) ); for :=1 to do ; wrtel('kerem az',,'.szamot'); read(x[]); procedure utofeltetel; DB:=0; for :=1 to do f ((X[]) mod 2)=0 the DB:=DB+1; procedure k; wrtel(db, ' db Paros szam va a sorozatba.'); be; utofeltetel; k; ed.
I / 6. Maxmumkválasztás Feladat: Adott egy elemű számsorozat. Állapítsuk meg a legagyobb elem dexéek a számát! A sorozatot az elemű X vektorba tároljuk, melyek eleme H halmazba tartozak. Bemeet N, előfeltétel 1 X H 1 MAX és (1 ) : XMAX X Eljárás Maxmumkválasztás MAX:=1 Cklus =2-től -g Ha X(MAX) < X() akkor MAX:= Eljárás vége. Kmeet MAX N Példa: Egy dyeföld dyéek tömegét mértük meg. Adjuk meg melyk dye volt a legehezebb! Bemeet N, előfeltétel 1 X R 1 MAX és (1 ) : XMAX X Eljárás Maxmumkválasztás MAX:=1 Cklus =2-től -g Ha X(MAX) < X() akkor MAX:= Eljárás vége. Kmeet MAX N program max; uses crt; type valostomb=array[1..1000]of real; var,, MAX:teger; X:valostomb; procedure be; repeat wrtel('hay dyet mertuk meg'); readl(); utl ( (<=1000) ad (>0) ); for :=1 to do
; wrtel('kerem az',,'.dye tomeget!'); read(x[]); procedure utofeltetel; MAX:=1; for :=2 to do f (X[] > X[MAX]) the MAX:=; procedure k; wrtel(max, '.dye volt a legehezebb'); be; utofeltetel; k; ed.
II. Összetett programozás tételek (Sorozathoz sorozat redelése)
II / 1. Másolás Feladat: Adott egy elemű X sorozat. Másoljuk le X sorozatot Y-ba úgy, hogy X, elemszáma és Y elemszáma egyezze meg! A másolás közbe az adott elemre voatkozó átalakítást végezhetük. Bemeet előfeltétel - N X H f : H G Y = f ( X ) (1 ) : Eljárás Másolás Cklus :=1-től N-g Y():=f(X()) Eljárás vége Kmeet Y G Példa: Adott egy 12 elemű számsorozat X tömbbe. Képezzük X elemeek égyzetét Y-ba! Bemeet N X H f : H G f(a) f(a):=a*a függvéy vége előfeltétel - Y = f ( X ) Kmeet (1 ) : Y G Eljárás Másolás Cklus :=1-től N-g Y():=f(X()) Eljárás vége program masol; uses crt; cost Nmax=12; type EgesztombTpus=array[1..Nmax]of teger; var :teger; X,Y:EgesztombTpus; fucto szamolas(elem:teger):teger; szamolas:=elem*elem;
procedure be; radomze; for :=1 to Nmax do X[]:=radom(50); procedure utofeltetel; for :=1 to Nmax do ; Y[]:=szamolas(X[]); procedure k; clrscr; wrtel('az X tömb eleme: '); for :=1 to Nmax do wrte(x[]:5,' '); wrtel; wrtel('az Y tömb eleme: '); for :=1 to Nmax do wrte(y[]:5,' '); readl; clrscr; be; utofeltetel; k; ed.
II / 2. Kválogatás Feladat: Adott egy elemű X sorozat. Másoljuk le X sorozatot Y-ba úgy, hogy X, elemszáma és Y elemszáma em kell, hogy megegyezze! Tehát, csak X tömb adott tulajdoságú elemet másoljuk át Y tömbbe. A másolás közbe az adott elemre voatkozó átalakítást végezhetük. Bemeet N, X H f : H G T : H L előfeltétel - DBY = = 1 χ ( X ) ( ) 1, hat X χ = 0, külöbe (1 ) : Y = f X ( ) Eljárás kválogatás Cklus :=1-től N-g ha T(X()) akkor Y():=f(X()) Eljárás vége Kmeet DBY N, Y G DBY
Példa: Adott egy 10 elemű számsorozat X tömbbe. Képezzük X páros elemeek égyzetét Y-ba! Bemeet előfeltétel - Kmeet N, X H f : H G T : H L DBY = = 1 χ ( X ) ( ) 1, hat X χ = 0, külöbe (1 ) : Y = f X N, X H f : H G T : H L ( ) f(a) f(a):=a*a függvéy vége Eljárás kválogatás Cklus :=1-től N-g ha Páros (X()) akkor DBY:=DBY+1 Y(DBY):=f(X()) Eljárás vége program kválogatás; uses crt; cost Nmax=10; type EgesztombTpus=array[1..Nmax]of teger; var,dby:teger; X,Y,Z:EgesztombTpus; fucto Ttulajdosagu(elem:teger):boolea; Ttulajdosagu:=(elem mod 2) = 0; procedure be; radomze; for :=1 to Nmax do X[]:=radom(100); procedure utofeltetel; dby:=0; for :=1 to Nmax do ; f Ttulajdosagu(x[]) the dby:=dby+1; Y[dbY]:=X[] ed procedure k; clrscr; wrtel('az X tömb eleme: ');for :=1 to Nmax do wrte(x[]:3,' '); wrtel('az Y tömb eleme: ');for :=1 to dby do wrte(y[]:3,' '); clrscr; be; utofeltetel; k; ed.
II / 3. Szétválogatás Feladat: Adott egy elemű X sorozat. T tulajdoságú elemet másoljuk át Y, lletve em tulajdoságú elemet másoljuk át Z tömbbe. A másolás közbe az adott elemre voatkozó átalakítást végezhetük. Bemeet N, X H f : H G T : H L előfeltétel - DBY = = 1 ( X ) ( ) 1, hat X χ = 0, külöbe DBZ = N DBY Y H DBY, ( ) (1 N) : Y = T Y Z H DBZ χ ( ) (1 N) : Y = T Z Y X Z X Eljárás szétválogatás dby:=0 dbz:=0 Cklus :=1-től N-g ha T(X()) akkor dby:=dby+1 Y(dby):=X() külöbe dbz:=dbz+1 Z():=X() Eljárás vége Kmeet DBY N, DBZ N, Y H Y H DBY DBY
Példa: Adott egy 10 elemű számsorozat X tömbbe. Képezzük X páros elemeek égyzetét Y-ba, Z-be pedg másoljuk át X páratla elemeek 5-tel övelt értékét. Bemeet N, X H f : H G T : H L előfeltétel - DBY = = 1 ( X ) ( ) 1, hat X χ = 0, külöbe DBZ = N DBY Y H DBY, ( ) (1 N) : Y = T Y Z H DBZ χ ( ) (1 N) : Y = T Z Y X Z X Eljárás szétválogatás dby:=0 dbz:=0 Cklus :=1-től N-g ha (X() mod 2) = 0 akkor dby:=dby+1 Y(dby):=(X()) 2 külöbe dbz:=dbz+1 Z():=X()+5 Eljárás vége Kmeet DBY N, DBZ N, program szetvalogat; uses crt; cost Nmax=10; Y H Y H DBY DBY type EgesztombTpus=array[1..Nmax]of teger; var,dby,dbz:teger; X,Y,Z:EgesztombTpus; fucto Ttulajdosagu(elem:teger):boolea; Ttulajdosagu:=(elem mod 2) = 0; procedure be; radomze; for :=1 to Nmax do X[]:=radom(100);
procedure utofeltetel; dby:=0;dbz:=0; for :=1 to Nmax do ; f Ttulajdosagu(x[]) the dby:=dby+1; Y[dbY]:=X[]*X[] ed else dbz:=dbz+1; Z[dbZ]:=X[]+5 procedure k; clrscr; wrtel('az X tömb eleme: '); for :=1 to Nmax do wrte(x[]:3,' '); wrtel; wrtel('az Y tömb eleme: '); for :=1 to dby do wrte(y[]:3,' '); wrtel; wrtel('a Z tömb eleme: '); for :=1 to dbz do wrte(z[]:3,' '); readl; clrscr; be; utofeltetel; k; ed.
II / 4. Metszet Feladat: Adott két sorozat: X és Y. Képezzük Z-be X és Y metszetét. Válogassuk k, tehát Z-be azo elemeket, melyek mdkét tömbbe, X-be és Y-ba s megtalálhatóak. Bemeet N, X H m N, Y H előfeltétel X,Y halmazfelsorolás = 1 (1 DB) m ( X Y) DB= χ Z X Z Y Z : halmazfelsorolás Eljárás metszet db:=0 Cklus :=1-től N-g j:=1 Cklus amíg J M és X() Y(j) J:=J+1 ha J M akkor db:=db+1 Z(db):=X() Eljárás vége Kmeet DB N, Z H DB Példa: Adott két 10 elemű számsorozat X, Y tömbbe. Képezzük metszetüket! Bemeet N, X H m N, Y H előfeltétel X,Y halmazfelsorolás = 1 (1 DB) m ( X Y) DB= χ Z X Z Y Z : halmazfelsorolás Eljárás metszet db:=0 Cklus :=1-től N-g j:=1 Cklus amíg J M és X() Y(j) J:=J+1 ha J M akkor db:=db+1 Z(db):=X() Eljárás vége Kmeet DB N, Z H DB
program metszet; uses crt; cost Nmax=10; type EgesztombTpus=array[1..Nmax]of teger; var,j,db,,m:teger; X,Y,Z:EgesztombTpus; procedure be; :=Nmax;m:=Nmax-2; radomze; X[1]:=radom(5);Y[1]:=radom(5); for :=2 to N do repeat X[]:=radom(*5) utl X[-1]<X[]; radomze; for :=2 to M do repeat Y[]:=radom(*5) utl Y[-1]<Y[]; procedure utofeltetel; db:=0; For :=1 to N do ; j:=1; Whle ((j<=m) ad (X[]<>Y[j])) do c(j); f j<=m the c(db); Z[db]:=X[]; procedure k; clrscr; wrtel('az X tömb eleme: '); for :=1 to N do wrte(x[]:3,' '); wrtel; wrtel('az Y tömb eleme: '); for :=1 to M do wrte(y[]:3,' '); wrtel; wrtel('a Z tömb eleme: '); for :=1 to db do wrte(z[]:3,' '); f db=0 the wrte('z üres halmaz'); readkey; clrscr; be; utofeltetel; k; ed.
II / 5. Uó Feladat: Adott két sorozat: X és Y. Képezzük Z-be X és Y uóját. képezzük tehát Z-be halmazfelsorolást, melybe X és Y mde eleme egyszer szerepel. Bemeet N, X H m N, Y H előfeltétel X,Y halmazfelsorolás m = 1 (1 DB) m ( Y( ) X) DB= + χ Z X Z Y Kmeet DB N, Z : halmazfelsorolás Z H DB Eljárás Uo Cklus :=1-től -g Z():=X() DB:= Cklus j:=1-től m-g :=1 Cklus amíg és X() Y(j) :=+1 ha > akkor db:=db+1 Z(db):=Y(j) Eljárás vége Példa: Adott két 10 elemű számsorozat X, Y tömbbe. Képezzük uójukat! Bemeet N, X H m N, Y H előfeltétel X,Y halmazfelsorolás m = 1 (1 DB) m ( Y( ) X) DB= + χ Z X Z Y Kmeet DB N, Z : halmazfelsorolás Z H DB Eljárás Uo Cklus :=1-től -g Z():=X() DB:= Cklus j:=1-től m-g :=1 Cklus amíg és X() Y(j) :=+1 ha > akkor db:=db+1 Z(db):=Y(j) Eljárás vége
program uo; uses crt; cost Nmax=10; type EgesztombTpus=array[1..1+Nmax+Nmax] of teger; var,j,db,,m:teger; X,Y,Z:EgesztombTpus; procedure be; :=Nmax;m:=Nmax-2; radomze; X[1]:=radom(5);Y[1]:=radom(5); for :=2 to N do repeat X[]:=radom(*5) utl X[-1]<X[]; radomze; for :=2 to M do repeat Y[]:=radom(*5) utl Y[-1]<Y[]; procedure utofeltetel; db:=0; for :=1 to do Z[]:=X[] db:=n; For j:=1 to M do :=1; Whle ((<=) ad (X[]<>Y[j])) do c(); f >N the ; c(db); Z[db]:=Y[j]; procedure k; clrscr; wrtel('az X tömb eleme: '); for :=1 to N do wrte(x[]:3,';'); wrtel; wrtel('az Y tömb eleme: '); for :=1 to M do wrte(y[]:3,';'); wrtel; wrtel('a Z tömb eleme: '); for :=1 to db do wrte(z[]:3,';'); readkey; clrscr; be; utofeltetel; k; ed.
III / 1. Egyszerű cserés redezés Feladat: N elemű sorozat agyság szert redezése Hasolítsuk össze az első elemet a sorozat összes több mögötte lévő elemével, és ha valamelyk ksebb ála, akkor cseréljük meg azzal! Ezzel elérhetjük, hogy a sorozat első helyére a legksebb elem kerül. Folytassuk ugyaeze az elve a sorozat másodk elemével, utoljára pedg az utolsó előttvel. Redezés cklus :=1 től N-1 g cklus j=+1 től N-g Ha X()>X(j) akkor csere(x(),x(j)) cklus vége cklus vége Eljárás vége Helyfoglalás: N+1 Hasolítások száma: N*(N-1)/2 Mozgatások száma: 0..3**(-1)/2 III / 2. Mmumkválasztásos redezés Feladat: N elemű sorozat agyság szert redezése Az előző módszer hbája a sok felesleges csere. Célszerűbb lee az aktuáls első elemet a mögötte lévők közül a legksebbel cserél. Ehhez a redező cklus belsejébe cserék helyett egy mmumkválasztást kell elvégez. Redezés cklus :=1 től N-1 g m:= cklus j=+1 től N-g Ha X(m)>X(j) akkor m:=j cklus vége csere(x(),x(j)) cklus vége Eljárás vége Helyfoglalás: N+1 Hasolítások száma: N*(N-1)/2 Mozgatások száma: 3*(-1)
III / 3. Buborékos redezés Feladat: N elemű sorozat agyság szert redezése Hasolítsuk a szomszédokat egymással. Ha rossz a sorredjük, akkor cseréljük meg őket. Egy ckluslépés alatt lefutása alatt bztosa a sorozat végére kerül a legagyobb elem. Redezés cklus :=N től 2 g cklus j=1 től -1-g Ha X(j)>X(j+1) akkor csere(x(j),x(j+1)) cklus vége cklus vége Eljárás vége Helyfoglalás: N+1 Hasolítások száma: N*(N-1)/2 Mozgatások száma: 0..3*N*(N-1)/2 III / 4. Javított buborékos redezés Feladat: N elemű sorozat agyság szert redezése Az előző módszer azért em váltotta be reméyeket, mert em haszáltuk k, hogy az elemek a helyük felé mozogak. A legegyszerűbb esetbe például, ha a belső cklus lefutása alatt egyáltalá em volt csere, akkor felesleges mde tovább hasolítás, a redezéssel késze vagyuk. Ha volt csere, de például a legutolsó sorozat közepé volt, akkor ebből tudjuk, hogy a sorozat közepe utá bztosa kész, redezett, csak az előtte lévő résszel kell foglalkoz. Fgyeljük tehát mde meetbe a legutolsó csere helyét, s a következő meetbe csak addg redezzük. Redezés := cklus amíg 2 cs:=0; cklus j=1 től -1g ha X(j)>X(j+1) akkor csere (X(j),X(j+1)) cs:=j cklus vége :=cs cklus vége Eljárás vége Helyfoglalás: N+1 Hasolítások száma: N-1..N*(N-1)/2 Mozgatások száma: 0..3*N*(N-1)/2
III / 5. Bellesztéses redezés Feladat: N elemű sorozat agyság szert redezése Az előző redezések mdegyke olya volt, hogy a sorozatot felosztotta egy redezett (kész), és egy redezetle szakaszra, és a redezést a redezetle része folytatta. Másk közös voásuk, hogy a redezés elkezdéséhez már az összes redezedő elem smeretére szükségük volt. Most a kártyakeveréshez hasoló elvből duluk k: egyetle elem mdg redezett; ha va egy redezett részsorozatuk, akkor abba a agyság szert helyére llesszük be a soro következő elemet! eljárás utofeltetel; cklus :=2 -tól N g j:=-1; cklus amíg ((j>0) és (X[j]>X[j+1])) csere(x[j],x[j+1]);j:=j-1; cklus vége; cklus vége; eljárás vége; Helyfoglalás: N+1 Hasolítások száma: N-1 N*(N-1)/2 Mozgatások száma: 0..3*N*(N-1)/2 III / 6. Javított bellesztéses redezés Feladat: N elemű sorozat agyság szert redezése Az előző módszerél a bellesztedő cklusba legtöbb elem egyszer mozdul el, a bellesztedő pedg sokszor. Ezt a sok mozgást s csökkethetjük egyetleegyre úgy, hogy a bellesztedőt em tesszük be azoal a sorozatba, haem csak a többeket tologatjuk hátra, s a bellesztedőt csak a végé tesszük a helyére. eljárás redezés; cklus :=2 -tól Nmax-g j:=-1; y:=x[]; cklus amíg ((j>0) és (X[j]>y)) X[j+1]:=X[j];j:=j-1; cklus vége; X[j+1]:=y; cklus vége; Helyfoglalás: N+1 Hasolítások száma: N-1 N*(N-1)/2 Mozgatások száma: 2*(N-1)..2*(N-1)+N*(N-1)/2
III / 7. Szétosztó redezés Feladat: N elemű sorozat agyság szert redezése Eddg az alapredezéseket, lletve javításakat tárgyaltuk. Az elkövetkezedőkbe specáls redezésekkel foglalkozuk. A szétosztó redezés esetébe feltesszük, hogy a redezedő elemek olya rekordok, melyek kulcsmezője (vagy az abból kszámolt számérték) 1..N közt természetes szám lehet és cs két azoos kulcsú rekord. A kulcsmező tt egyértelműe megadja azt a helyet, ahová a az elemet te kell, így semm hasolításra cs szükség. A módszerhez azoba egy újabb tömbre va szükség, ahová az eredméyt elhelyezzük. eljárás redezés; cklus :=1 -tól Nmax g Y[X[].dex]:=X[]; cklus vége; eljárás vége Helyfoglalás: 2*N Hasolítások száma: 0 Mozgatások száma: N Kulcsmeződexelés: N
III / 8. Számláló redezés Az egyszerű cserés módszer mozgatásaak számát s javíthatjuk az egyk újabb módszer a szétosztó redezés segítségével. A csrés redezésél e cserélgessük az elemeket, haem számoljuk meg háy mdegykre, hogy háy ála ksebb, lletve az őt megelőzők között háy vele egyelő va (ömagát s beleértve). Ezzel a redezedő adatsorhoz a [0, N-1] tervallum egész számaak egy permutácóját redeltük. Ez a permutácó lehet bemeete a szétosztó redezések. eljárás redezés cklus :=1 -tól Nmax DB[]:=1; cklus vége; cklus :=1 -tól Nmax-1 g cklus j:=+1 -tól Nmax g ha X[]>X[j] akkor c(db[]) külöbe c(db[j]) elágazás vége cklus vége; cklus vége; cklus :=1 -tól Nmax g Y[DB[]]:=X[] cklus vége; Szétosztó redezés eljárás vége; Helyfoglalás: 2*N+N*ε Hasolítások száma: N*(N-1)/2 Mozgatások száma: N Kulcsmeződexelés: N Forrás: Iteret µlóga 19 Szláv Péter, Zsakó László Módszeres programozás: Programozás tételek