Rendezések Összehasonlító rendezések Remdezés - Alapfeladat: Egy A nevű N elemű sorozat elemeinek nagyság szerinti sorrendbe rendezése - Feltételezzük: o A sorozat elemei olyanok, amelyekre a >, relációk léteznek o A sorozathoz létezik indexelés művelete - A módszerek összehasonlítási alapja o Tárigény o Idő végrehajtott műveletek száma Egyszerű cserés rendezés Ciklus i -től N- ig Ciklus j i+ től N-ig Ha A[i] > A[j] akkor A[i] A[j] Hely: N+ Hasonlítás: N * (N-) / (Ordo(n )) Mozgatás: 0 *N*(N-) / (Ordo(n )) Minimumkiválasztásos rendezés Ciklus i -től N- ig MIN i Ciklus j i+ től N-ig Ha A[MIN] > A[j] akkor MIN j A[i] A[MIN] Hely: N+ Hasonlítás: N * (N-) / (Ordo(n )) Mozgatás: 0 *N*(N-) ((Ordo(n)) Buborékos Rendezés Ciklus i N-től -ig Ciklus j -től i--ig Ha A[j] > A[j+] akkor A[j] A[j+] Hely: N+ Hasonlítás: N * (N-) / (Ordo(n )) Mozgatás: 0 *N*(N-) / (Ordo(n )) Javított buborékos rendezés i N Ciklus amíg i CS 0 Ciklus j -től i--ig Ha A[j] > A[j+] akkor A[j] A[j+] CS j i CS Hely: N+ Hasonlítás: ((Ordo(n )) Mozgatás: ((Ordo(n ))
Beillesztéses rendezés Ciklus i -től N-ig j i- Ciklus amíg (j 0) és (A[j] > A[j+] A[j] A[j+] j j Hely: N+ Hasonlítás: ((Ordo(n )) Mozgatás: ((Ordo(n )) Javított Beillesztéses rendezés Ciklus i -től N-ig j i Y A[i] Ciklus amíg (j 0) és (A[j] > Y) A[j+] A[j] J j A[j+] Y Hely: N+ Hasonlítás: ((Ordo(n )) Mozgatás: ((Ordo(n )) Shell Rendezés Eljárás Rendezés (N, A, L0) L L0 Ciklus amíg L Ciklus k L+ től *L ig Ciklus i k-tól N-ig L-esével j i L ; y A[i] Ciklus amíg (j > 0) és (A[j] > y ) A[j+L] A[j]; j j L A[j+L] y L Következő_L(L) Lépésszám: Ordo(n*log n) Kupacrendezés Kupac adatszerkezet - Bináris kupac: Egy majdnem teljes bináris fa egy tömbben ábrázolva - A tömb mérete: kupac mérete = N Kupac tulajdonság - A kupac minden i, gyökértől különböző eleme esetén: A[Szülő(i)] A[i] 0 8 Fa-Kupac megfeleltetés: Szülő(i) : i / Bal(i) : * i Jobb(i) : * i + 8 6 Tehát egy olyan bináris fát képvisel, amelyre igaz, hogy minden csúcs bal és jobb oldali részfájában csak kisebb vagy egyenlő értékek találhatók. Ez nem azonos a tanult bináris keresőfa adatszerkezettel!
Kupactulajdonság fenntartása Eljárás Kupacol( A, i, N) b Bal(i); j Jobb(i) Ha b N és A[b] > A[i] akkor MAX b Különben MAX i Ha j N és A[j] > A[MAX] akkor MAX j Ha MAX i akkor A[i] A[legnagyobb] Kupacol (A, MAX, N) Kupac felépítése Eljárás Kupacot-Épít (A) N Tömb_méret(A) Ciklus i N / től -ig Kupacol ( A, i, N) Az A tömböt alulról felfelé haladva kupaccá alakítjuk. Az N/-től N-ig terjedő indexű elemek levelek, tehát egy elemű (kupactulajdonságot teljesítő) fáknak tekinthetőek, így csak a többi csúcsot kell ellenőrizni. A feldolgozás sorrendje garantálja a Kupacol eljárás előfeltételét Kupacrendezés Eljárás Kupacrendezés (A) Kupacot-Épít (A) Ciklus i N-től -ig A[] A[i] N N Kupacol (A,, N) A kupacban a gyökér elem biztosan a legnagyobb. Ötlet: ezt helyezzük a tömb végére, zárjuk ki a kupacból, majd a maradék elemekből építsünk újra kupacot Kupacba beszúrás Eljárás Kupacba-beszúr (A, kulcs) N N + i N Ciklus amíg ( i > ) és (kulcs > A[Szülő(i)]) A[i] A[Szülő(i)] I Szülő(i) A[i] kulcs A kupac kibővítése után beszúró rendezésnél látott módon megkeresi az új kulcs helyét a kupacban. Kupacbaredenzés elemzése - A kupacbarendezés futási ideje: O( n * lg n) - Gyakorlati alkalmazása: elsőbbségi sorok o Műveletek: beszúrás, maximum, kivesz-minimum, kupacba beszúr
Nem-összehasonlító rendezések Szétosztó rendezés Feltételezzük, hogy a kulcsok é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 -től N-ig B[A[i].kulcs] A[i] Ha a kulcsok nem fedik le teljesen az..n intervallumot, akkor kezelni kell az üres helyeket az eredményben. Lépésszám: O(n) Leszámláló rendezés Eljárás Leszámláló-rendezés (A, B, N, K) C[] 0 Ciklus i -től N-ig C[A[i].kulcs] C[A[i].kulcs] + Ciklus i -től K-ig C[i] C[i] + C[i-] Ciklus i N-től -ig B[C[A[i].kulcs]] A[i] C[A[i].kulcs] C[A[i].kulcs] Lépésszám: O(n)
Stabil: megtartja az azonos kulcsú elemek sorrendjét! 7 0 0 6 8 0 Kata 7 0 6 8 0
Radix (számjegyes) rendezés Eljárás Radix-rendezés( A, D) Ciklus -től D-ig {Stabil rendezés az i. számjegyen } 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ó Lépésszám: O(n) 67 7 67 7 67 7 7 67 Radix rendezés a gyakorlatban - Gyakorlati megvalósítások o Régen lyukkártyák o Számjegyenkénti rendezés o Szövegek rendezése o 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 Edényrendezés Eljárás Edény-rendezés(A, N) Ciklus i -től N-ig Listába_beszúrás( B[f(A[i])], A[i]) Ciklus i -től M-ig Lista_rendezés(B[i]) Ciklus i -től M-ig Lista_összefűzés(C, B[i]) 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..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ó