Közismereti informatika I. 4. előadás
Rendezések Bemenet: N: Egész, X: Tömb(1..N: Egész) Kimenet: X: Tömb(1..N: Egész) Előfeltétel: Utófeltétel: Rendezett(X) és X=permutáció(X ) Az eredmény a bemenet egy permutációja. Rendezett(X): i(1 i N-1): X[i] X[i+1] Zsakó László: Közismereti informatika I. 2
Egyszerű cserés rendezés Hasonlítsuk az első elemet az összes mögötte levővel, s ha kell, cseréljük meg! Ezután ugyanezt csináljuk a második elemre! Végül az utolsó két elemre! A minimum az elejére kerül. Zsakó László: Közismereti informatika I. 3
Egyszerű cserés rendezés Rendezés: Ciklus i=1-től N-1-ig Ciklus j=i+1-től N-ig Ha X[i]>X[j] akkor Csere(X[i],X[j]) Eljárás vége. Hasonlítások száma: 1+2+..+N-1= N N 1 N 1 2 Mozgatások száma: 0 3 N 2 Zsakó László: Közismereti informatika I. 4
Minimumkiválasztásos rendezés Vegyük az első elem mögöttiek minimumát, s cseréljük meg az elsővel! Ezután ugyanezt csináljuk a második elemre! Végül az utolsó két elemre! Zsakó László: Közismereti informatika I. 5
Minimumkiválasztásos rendezés Rendezés: Ciklus i=1-től N-1-ig Min:=i Ciklus j=i+1-től N-ig Ha X[j]<X[Min] akkor Min:=j Csere(X[i],X[Min]) Eljárás vége. Hasonlítások száma: 1+2+..+N-1= Mozgatások száma: 3*(N-1) N N 1 2 Zsakó László: Közismereti informatika I. 6
Buborékos rendezés Hasonlítsunk minden elemet a mögötte levővel, s ha kell, cseréljük meg! Ezután ugyanezt csináljuk az utolsó elem nélkül! Végül az első két elemre! A maximum a végére kerül. A többbiek is tartanak a helyük felé. Zsakó László: Közismereti informatika I. 7
Buborékos rendezés Rendezés: Ciklus i=n-től 2-ig -1-esével Ciklus j=1-től i-1-ig Ha X[j]>X[j+1] akkor Csere(X[j],X[j+1]) Eljárás vége. Hasonlítások száma: 1+2+..+N-1= N N 1 2 Mozgatások száma: 0 N 1 3 N 2 Zsakó László: Közismereti informatika I. 8
Javított buborékos rendezés Megfigyelések: Ha a belső ciklusban egyáltalán nincs csere, akkor be lehetne fejezni a rendezést. Ha a belső ciklusban a K. helyen van az utolsó csere, akkor a K+1. helytől már biztosan jó elemek vannak, a külső ciklusváltozóval többet is léphetünk. Zsakó László: Közismereti informatika I. 9
Javított buborékos rendezés Rendezés: i:=n Ciklus amíg i>1 cs:=0 Ciklus j=1-től i-1-ig Ha X[j]>X[j+1] akkor Csere(X[j],X[j+1]) cs:=j i:=cs Eljárás vége. Zsakó László: Programozási alapismeretek 10
Rendezések Mit tudunk az eddigi módszerekről? A külső ciklus egy lefutása alatt legalább 1 elem a végleges helyére kerül. (Azaz például azonnal kiírhatnánk az eredménybe.) A külső ciklus egy lefutásához már ismernünk kell az összes elemet. Zsakó László: Közismereti informatika I. 11
Beillesztéses rendezés Egy elem mindig rendezett. A másodikat vagy mögé, vagy elé tesszük. Az i-ediket az addigiak mögé tesszük, majd addig hozzuk előre, amíg a helyére nem kerül. Az utolsóval ugyanígy! X A megoldás: Keresés tétel közben cserélgetünk Zsakó László: Közismereti informatika I. 12
Beillesztéses rendezés Rendezés: Ciklus i=2-től N-ig j:=i-1 Ciklus amíg j>0 és X[j]>X[j+1] Csere(X[j],X[j+1]); j:=j-1 Eljárás vége. Hasonlítások száma: N-1 N N 1 2 N 1 Mozgatások száma: 0 3 N 2 Zsakó László: Közismereti informatika I. 13
Javított beillesztéses rendezés Egy elem mindig rendezett. A másodikat vagy mögé, vagy elé tesszük. Az i-ediknél kisebbeket tologassuk hátra, majd illesszük be eléjük az i-ediket! Az utolsóval ugyanígy! X A megoldás: Keresés tétel közben tologatunk. Zsakó László: Közismereti informatika I. 14
Javított beillesztéses rendezés Rendezés: Ciklus i=2-től N-ig j:=i-1; s:=x[i] Ciklus amíg j>0 és X[j]>s X[j+1]:=X[j]; j:=j-1 X[j+1]:=s Eljárás vége. Hasonlítások száma: N-1 Mozgatások száma: 2*(N-1) N N 1 2 ( N 1) N 1 2 Zsakó László: Közismereti informatika I. 15
Rendezések Mit tudunk a két beillesztéses rendezés változatról? A külső ciklus utolsó lefutására kerül minden elem a végleges helyére. A külső ciklus egy lefutásához elég ismernünk a következő elemet. (Azaz most például beolvasás közben is végezhetnénk a rendezést.) Zsakó László: Közismereti informatika I. 16
Szétosztó rendezés Ha a rendezendő sorozatról speciális tudásunk van, akkor próbálkozhatunk más módszerekkel is. Rendezés N lépésben: Bemenet: N: Egész, X: Tömb(1..N: Egész) Kimenet: Y: Tömb(1..N: Egész) Előfeltétel: X=permutáció(1,,N) Utófeltétel: Rendezett(Y) és Y=permutáció(X) Zsakó László: Közismereti informatika I. 17
Szétosztó rendezés Rendezés: Ciklus i=1-től N-ig Y[X[i]]:=X[i] Eljárás vége. Persze ehelyett írhattuk volna: Y[i]:=i!!! Zsakó László: Közismereti informatika I. 18
Szétosztó rendezés Azaz a feladat akkor érdekes, ha pl. X[i] egy rekord, aminek az egyik mezője az 1 és N közötti egész szám: Y: Tömb(1..N: Rekord(kulcs: Egész, )) Rendezés: Ciklus i=1-től N-ig Y[X[i].kucs]:=X[i] Eljárás vége. Zsakó László: Közismereti informatika I. 19
Számlálva szétosztó rendezés Most azt tételezzük fel, hogy a rendezendő értékek tetszőleges 1 és M közötti egész számok (vagy azzá transzformálhatók). Bemenet: N,M: Egész, X: Tömb(1..N: Egész) Kimenet: Y: Tömb(1..N: Egész) Előfeltétel: i(1 i N): 1 X[i] M Utófeltétel: Rendezett(Y) és Y=permutáció(X) Zsakó László: Közismereti informatika I. 20
Számlálva szétosztó rendezés Első lépésben számoljuk meg, hogy melyik értékből hány van a rendezendő sorozatban! Rendezés: Db:=(0,,0) Ciklus i=1-től N-ig Ha X[i]=1 akkor Db[1]:=Db[1]+1 Ha X[i]=1 akkor Db[1]:=Db[1]+1 Amennyi az X[i], annyiadik számlálót növeljük: elágazás helyett indexelés! Zsakó László: Közismereti informatika I. 21
Számlálva szétosztó rendezés Rendezés: Db:=(0,,0) Ciklus i=1-től N-ig Db[X[i]]:=Db[X[i]]+1 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! Zsakó László: Közismereti informatika I. 22
Számlálva szétosztó rendezés ut[1]:=db[1] Ciklus i=2-től M-ig ut[i]:=ut[i]+db[i] 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ítsunk: az utolsó i értékű elemet ettől kezdve eggyel kisebb helyre kell tenni. Zsakó László: Közismereti informatika I. 23
Számlálva szétosztó rendezés Ciklus i=1-től N-ig Y[ut[X[i]]]:=X[i] ut[x[i]]:=ut[x[i]]-1 Eljárás vége. Mozgatások száma: N Összeadások száma: M+2*N Zsakó László: Közismereti informatika I. 24
Számláló rendezés Ha nem megy a szétosztó rendezés, akkor segítsünk magunkon, először számoljunk, azután osszunk szét! Ehhez használhatjuk a legegyszerűbb, cserés rendezés elvét. Jelentse Db[i] az i. elemnél kisebb, vagy az i.-től balra levő, vele egyenlő elemek számát! Zsakó László: Közismereti informatika I. 25
Számláló rendezés Rendezés: Db:=(0,,0) Ciklus i=1-től N-1-ig Ciklus j=i+1-től N-ig Ha X[i]>X[j] akkor Db[j]:=Db[j]+1 különben Db[i]:=Db[i]+1 Ciklus i=1-től N-ig Y[Db[X[i]]:=X[i] Eljárás vége. Hasonlítások száma: 1+2+..+N-1= Mozgatások száma: N N N 1 2 Zsakó László: Közismereti informatika I. 26
Rendezések N 2 idejű rendezések: Egyszerű cserés rendezés Minimumkiválasztásos rendezés Buborékos rendezés Javított buborékos rendezés Beillesztéses rendezés Javított beillesztéses rendezés Számláló rendezés Zsakó László: Közismereti informatika I. 27
Rendezések N (N+M) idejű rendezések: (de speciális előfeltétellel) Szétosztó rendezés Számlálva szétosztó rendezés Kitekintés: (Algoritmusok tantárgy) Lesznek N*log(N) idejű rendezések. Nem lehet N*log(N)-nél jobb általános rendezés! Zsakó László: Közismereti informatika I. 28
Közismereti informatika 4. előadás vége.