Tartalom Programozási alapismeretek 11. előadás Rendezési feladat specifikáció Egyszerű cserés Minimum-kiválasztásos Buborékos Javított buborékos Beillesztéses Javított beillesztéses Szétosztó Számlálva szétosztó Rendezések hatékonysága idő Szlávi- Zsakó: Programozási alapismeretek 11. /8 Rendezési feladat Specifikáció: Bemenet: :Egész, :Tömb[1..:Valami] Kimenet: :Tömb[1..:Valami] Előfeltétel: 0 Utófeltétel: RendezettE( ) és Permutáció() Jelölések: o : az kimeneti (megálláskori) értéke o RendezettE(): rendezett-e? o Permutáció(): az elemeinek egy permutációja-e? Rendezések (fontos új fogalmak, jelölések) Aposztróf a specifikációban: Ha egy adat előfordul a bemeneten és kimene-ten is, akkor az UF-ben együtt kell előfordul-nia az adat bemenetkori és kimenetkori érté-ke. Megkülönböztetésül a kimeneti értéket megaposztrofáljuk. Pl.: Z :=a Z kimeneti (megálláskori) értéke. Rendezett-e predikátum: RendezettE(Z): i(1 i 1): Z[i] Z[i+1] Permutációhalmaz: Permutáció(Z):= a Z elemeinek összes permutációját tartalmazó halmaz. Programozási alapismeretek 11. 3/8 Szlávi- Zsakó: Programozási alapismeretek 11. 4/8 Egyszerű cserés Egyszerű cserés Hasonlítsuk az első ele-met az összes mögötte levővel, s ha kell, cse-réljük meg! Ezután ugyanezt csi-náljuk a második elem-re! Végül az utolsó két pirossal jelöltek már helyükön A pirossal jelöltek már a helyükön i=1.. 1 j=i+1.. [i]>[j] S:=[i] [i]:=[j] [j]:=s Hasonlítások száma: 1++..+ 1= Mozgatások száma: 03 Programozási alapismeretek 11. 5/8 Szlávi- Zsakó: Programozási alapismeretek 11. 6/8
l fe Minimumkiválasztásos Vegyük az első elem mögöttiek minimumát, s cseréljük meg az elsővel, ha kell! Ezután ugyanezt csináljuk a második Végül az utolsó két A pirossal jelöltek már a helyükön Minimum-kiválasztás Minimumkiválasztásos i=1.. 1 Min:=i j=i+1.. [Min]>[j] Min:=j S:=[i] [i]:=[min] [Min]:=S Hasonlítások száma: 1++..+ 1= Mozgatások száma: 3 ( 1) Programozási alapismeretek 11. 7/8 Szlávi- Zsakó: Programozási alapismeretek 11. 8/8 Buborékos Buborékos Hasonlítsunk minden elemet a mögötte levővel, s ha kell, cserél-jük meg! Ezután ugyanezt csináljuk az utolsó elem nélkül! Végül az első két elem-re! A maximum a felső végére kerül. A többiek is tartanak a helyük felé. i=.., -1-esével j=1..i 1 [j]>[j+1] S:=[j] [j]:=[j+1] [j+1]:=s Hasonlítások száma: 1++..+ 1= Mozgatások száma: 0 3 Programozási alapismeretek 11. 9/8 Szlávi- Zsakó: Programozási alapismeretek 11. 10/8 Javított buborékos Megfigyelések: Ha a belső ciklusban egyáltalán nincs csere, akkor be lehetne fejezni a t. Ha a belső ciklusban a K. helyen van az utolsó csere, akkor a K+1. helytől már biz-tosan jó elemek, a külső ciklusvál-tozóval többet is léphetünk. Programozási alapismeretek 11. 1/8 Átírás amíg -os ciklussá u za esc ot eher ósl y ézyg jel Javított buborékos es i:= i cs:=0 j=1..i 1 [j]>[j+1] S:=[j] [j]:=[j+1] [j+1]:=s cs:=j i:=cs Szlávi- Zsakó: Programozási alapismeretek 11. 13/8
Beillesztéses Egy elem rendezett. A másodikat vagy mögé, vagy elé tesszük, így már ketten is rendezettek. Az i-ediket a kezdő, i 1 rendezettben addig hozzuk előre cserékkel, amíg a helyére nem kerül; így már i darab rendezett lesz. Az utolsóval ugyanígy! Programozási alapismeretek 11. 14/8 Beillesztéses i=.. j:=i 1 j>0 és [j]>[j+1] S:=[j] [j]:=[j+1] [j+1]:=s j:=j 1 Hasonlítások száma: 1 Mozgatások száma: 0 3 Szlávi- Zsakó: Programozási alapismeretek 11. 15/8 Javított beillesztéses Egy elem rendezett. A másodikat vagy mögé, vagy elé tesszük, így már ketten is rendezettek. Az i-ediknél a nála kisebbeket tologassuk hátra, majd illesszük be eléjük az i- ediket; így már i darab rendezett lesz. Az utolsóval ugyanígy! Programozási alapismeretek 11. 16/8 Elem-mozgatás, nem csere! Javított beillesztéses i=.. s:=[i] j:=i 1 j>0 és [j]>s [j+1]:=[j] j:=j 1 [j+1]:=s Hasonlítások száma: 1 Mozgatások száma: ( 1) ( 4) Szlávi- Zsakó: Programozási alapismeretek 11. 17/8 Szétosztó Szétosztó Ha a rendezendő sorozatról speciális tudásunk van, akkor megpróbálkozhatunk más módszerekkel is. Specifikáció lépésben: Bemenet: :Egész, :Tömb[1..:Egész] Kimenet: Y:Tömb[1..:Egész] Előfeltétel: 0 és Permutáció(1,,) Utófeltétel: RendezettE(Y) és Y Permutáció() i=1.. Y[[i]]:=[i] Persze ehelyett írhattuk volna: Y[i]:=i!!! Azaz a feladat akkor érdekes, ha pl. [i] egy rekord, aminek az egyik mezője az 1 és közötti egész szám:,y:tömb[1..:rekord(kulcs:egész, )] i=1.. Y[[i].kulcs]:=[i] Programozási alapismeretek 11. 18/8 Szlávi- Zsakó: Programozási alapismeretek 11. 19/8
Számlálva szétosztó Számlálva szétosztó Előfeltétel: a rendezendő értékek 1 és M közötti egész számok. Specifikáció: Bemenet:,M:Egész, :Tömb[1..:Egész] Kimenet: Y:Tömb[1..:Egész] Előfeltétel: 0 és M 1 és i(1 i ): 1 [i] M Utófeltétel: RendezettE(Y) és Y Permutáció() Programozási alapismeretek 11. 0/8 Első lépésben számoljuk meg, hogy melyik értékből hány van a rendezendő sorozatban! Ezután adjuk meg, hogy az utolsó i értéket hova kell tenni! Ez pontosan az i-nél kisebb vagy egyenlő számok száma a sorozatban! Végül nézzük végig újra a sorozatot, s az i értékű elemet tegyük a helyére, majd módosít-sunk: az utolsó i értékű elemet ettől kezdve eggyel kisebb Szlávi- Zsakó: Programozási alapismeretek 11. 1/8 helyre kell tenni. Számlálva szétosztó Db[1..M]:=0 i=1.. Db[[i]]:=Db[[i]]+1 i=..m Db[i]:=Db[i 1]+Db[i] i=1.. Y[Db[[i]]]:=[i] Db[[i]]:=Db[[i]] 1 Számláló Ha nem megy a szétosztó, akkor segítsünk magunkon, először számláljunk, azután osszunk szét! Ehhez használhatjuk a legegyszerűbb, cserés elvét. Jelentse Db[i] az i. elemnél kisebb, vagy az i.-től balra levő, vele egyenlő elemek számát! Mozgatások száma: Additív műveletek száma: M + Programozási alapismeretek 11. /8 Szlávi- Zsakó: Programozási alapismeretek 11. 3/8 Számláló Rendezések hatékonysága i=1.. 1 j=i+1.. [i]>[j] Db[i]:=Db[i] Db[j]:=Db[j]+1 +1 i=1.. Y[Db[i]]:=[i] Hasonlítások száma: 1++..+ 1= Mozgatások száma: idejű ek: Egyszerű cserés Minimum-kiválasztásos Buborékos Javított buborékos Beillesztéses Javított beillesztéses Számláló Additív műveletek száma: hasonlítások Programozási alapismeretek 11. 4/8 száma Szlávi- Zsakó: Programozási alapismeretek 11. 5/8
Rendezések hatékonysága Az évfolyamzh (+M) idejű ek: (de speciális feltétellel) Szétosztó Számlálva szétosztó Kitekintés: (Algoritmusok tantárgy) Lesznek log() idejű ek. em lehet log()-nél jobb általá-nos! A minta letöltése: http://progalap.elte.hu/downloads/kov /progalap_evfzh_minta.zip vagy http://people.inf.elte.hu/szlavi/bscpro galap/mintazh.zip és a partitúra : http://progalap.elte.hu/downloads/kov /progalap_evfolyamzh_teszteles.pdf Programozási alapismeretek 11. 6/8 Szlávi- Zsakó: Programozási alapismeretek 11. 7/8 Programozási alapismeretek 11. előadás vége