Nem összehasonlító rendezések Nem összehasonlító rendezések Programozás II. előadás http://nik.uni-obuda.hu/prog2 Szénási Sándor Óbudai Egyetem,Neumann János Informatikai Kar
Programozás II. 2 Rendezés fogalma Alapfeladat: Egy A nevű N elemű sorozat elemeinek nagyság szerinti sorrendbe rendezése Feltételezzük: A sorozat elemei olyanok, amelyekre a <, relációk léteznek. A sorozathoz létezik indexelés művelet A módszerek összehasonlításának alapja: tárigény idő (végrehajtott műveletek száma) bonyolultság Általunk tárgyalt típusok összehasonlító rendezések (a rendezéshez csak a bemeneti tömb elemein történő összehasonlítást használják) nem összehasonlító rendezések (a rendezéshez egyéb információkra is szükségük van)
Leszámláló rendezés Radix rendezés Edényrendezés Haladó rendezések
Programozás II. Szétosztó rendezés Feltételezzük, hogy N darab elemünk van, a kulcsok 1 és N közötti egész számok, és nincs két azonos kulcsú rekord eljárás Szétosztó-rendezés(A, B, N) ciklus i 1-től N-ig B[A[i].kulcs] A[i] ciklus vége eljárás vége Lépésszám: O(N) Ha a kulcsok nem fedik le teljesen az 1.. N intervallumot, akkor kezelni kell az üres helyeket az eredményben
Programozás II. 5 Leszámláló rendezés Feltételezzük, hogy N darab elemünk van, a kulcsok 1 és K közötti egész számok, és lehetnek köztük azonos kulcsú elemek eljárás Leszámláló-rendezés(A, címsz. B, N, K) C[] 0 ciklus i 1-től N-ig C[A[i].kulcs] C[A[i].kulcs] + 1 ciklus vége ciklus i 2-től K-ig C[i] C[i] + C[i-1] ciklus vége ciklus i N-től 1-ig B[C[A[i].kulcs]] A[i] C[A[i].kulcs] C[A[i].kulcs] 1 ciklus vége eljárás vége Lépésszám: O(N) Még pontosabban: N+K+N darab lépés. Nagyméretű K esetében ez problémákat okozhat
Leszámláló rendezés - bemenet Programozás II. 6 A 2 Peti 3 Kati 1 Feri Mari 1 Mici 5 Laci 1 Móni 1 Pali Béni 5 Sanyi 2 Tóni 3 Teri C B
Leszámláló rendezés 1. lépés Programozás II. 7 A 2 Peti 3 Kati 1 Feri Mari 1 Mici 5 Laci 1 Móni 1 Pali Béni 5 Sanyi 2 Tóni 3 Teri C 2 2 2 2 B
Leszámláló rendezés 2. lépés Programozás II. 8 A 2 Peti 3 Kati 1 Feri Mari 1 Mici 5 Laci 1 Móni 1 Pali Béni 5 Sanyi 2 Tóni 3 Teri C 6 8 10 12 B
Leszámláló rendezés 3. lépés Programozás II. 9 A 2 Peti 3 Kati 1 Feri Mari 1 Mici 5 Laci 1 Móni 1 Pali Béni 5 Sanyi 2 Tóni 3 Teri C 6 7 10 12 B 3 Teri
Leszámláló rendezés 3-2. lépés Programozás II. 10 A 2 Peti 3 Kati 1 Feri Mari 1 Mici 5 Laci 1 Móni 1 Pali Béni 5 Sanyi 2 Tóni 3 Teri C 5 7 10 12 B 2 Tóni 3 Teri
Leszámláló rendezés 3-N. lépés Programozás II. 11 A 2 Peti 3 Kati 1 Feri Mari 1 Mici 5 Laci 1 Móni 1 Pali Béni 5 Sanyi 2 Tóni 3 Teri C 0 6 8 10 B 1 Feri 1 Mici 1 1 Móni Pali 2 Peti 2 Tóni 3 Kati 3 Teri Mari Béna 5 Laci 5 Sanyi Stabil rendezés: megtartja az azonos kulcsú elemek sorrendjét!
Leszámláló rendezés Radix rendezés Edényrendezés Haladó rendezések
Programozás II. 13 Radix (számjegyes) rendezés Radix rendezés algoritmusa eljárás Radix-rendezés(címsz. A, D) ciklus i 1-től D-ig {Stabil rendezés az i. számjegyen } ciklus vége eljárás vége Paraméterei A rendezendő számokat tartalmazó tömb D számjegyek darabszáma Azonos hosszúságú számok, szövegek, struktúrák esetén használható Jelentősen lehet vele növelni a szétosztó rendezés hatékonyságát, ha a rendezendő elemek felbonthatók számjegyek -re Lépésszám: O(n)
Radix rendezés menete Programozás II. 1 Eredeti 1. lépés 2. lépés 3. lépés 12 657 52 211 57 55 15 551 151 15 13 382 211 551 151 12 52 382 55 15 15 13 657 57 211 12 13 52 551 151 55 15 15 657 57 382 13 151 15 15 211 382 12 57 52 551 55 657
Programozás II. 15 Radix rendezés a gyakorlatban Gyakorlati megvalósítások: Régen lyukkártyák Számjegyenkénti rendezés Szövegek rendezése Dátumok rendezése (év-hó-nap) Ha nem azonos hosszúságú minden szó, a rövidebbek elejét ki kell egészíteni!
Leszámláló rendezés Radix rendezés Edényrendezés Haladó rendezések
Programozás II. 17 Edényrendezés Edényrendezés algoritmusa eljárás Edény-rendezés(címsz. A, N) C[] ciklus i 1-től N-ig Listába_beszúrás(B[f(A[i])], A[i]) ciklus vége ciklus i 1-től M ig Lista_rendezés(B[i]) ciklus vége ciklus i 1-től M ig Lista_összefűzés(A, B[i]) ciklus vége eljárás vége
Programozás II. 18 Edényrendezés a gyakorlatban Akkor alkalmazható hatékonyan, ha a bemenet elemei egy megfelelő hasító függvény segítségével egyenletesen oszthatók el egy 1..M intervallumon Ideális esetben M = N Amennyiben az elosztás egyenletes, az egyes elemekben található láncolt listák elemtartalma kicsi lesz, így azok rendezése gyorsan végrehajtható Ez a sebesség növekedés ellensúlyozza a szétszórás és összefűzés által okozott többlet munkát
Programozás II. 19 Irodalomjegyzék Javasolt/felhasznált irodalom Cormen, Leiserson, Rivest: Algoritmusok, Műszaki Könyvkiadó, 1997 Pap, Szlávi, Zsakó: μlógia3 Módszeres programozás, ELTE TTK, 2002 Knuth: A számítógép programozás művészete 3., Műszaki Könyvkiadó, 1988