rendezesek ff
TRANSCRIPT
2
Témakörök
Alapvető összehasonlító rendezésekShell rendezés
KupacrendezésLeszámláló rendezés
Radix rendezésEdényrendezés
3
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– nem összehasonlító rendezések
4
Egyszerű cserés rendezés
• Tárigény: N+1• Lépésszám
– Hasonlítás: N*(N-1)/2 O(n2)– Mozgatás: 0 – 3*N*(N-1)/2 O(n2)
Eljárás Rendezés(N, A)
Ciklus i ←←←← 1-től N-1-ig
Ciklus j ←←←← i+1-től N-ig
Ha A[i] > A[j] akkor
A[i] ↔↔↔↔ A[j]
Elágazás vége
Ciklus vége
Ciklus vége
Eljárás vége
5
Minimumkiválasztásos rendezés
• Tárigény: N+1• Lépésszám
– Hasonlítás: N*(N-1)/2 O(n2)– Mozgatás: 0 – 3*(N-1) O(n)
Eljárás Rendezés(N, A)
Ciklus i ←←←← 1-től N-1-ig
MIN ←←←← i
Ciklus j ←←←← i+1-től N-ig
Ha A[MIN] > A[j] akkor MIN ←←←← j
Ciklus vége
A[i] ↔↔↔↔ A[MIN]
Ciklus vége
Eljárás vége
6
Buborékos rendezés
• Tárigény: N+1• Lépésszám
– Hasonlítás: N*(N-1)/2 O(n2)– Mozgatás: 0 – 3*N*(N-1)/2 O(n2)
Eljárás Rendezés(N, A)
Ciklus i ←←←← N-től 2-ig
Ciklus j ←←←← 1-től i-1-ig
Ha A[j] > A[j+1] akkor
A[j] ↔↔↔↔ A[j+1]
Elágazás vége
Ciklus vége
Ciklus vége
Eljárás vége
7
Javított buborékos rendezés
Tárigény: N+1 Hasonlítás: O(n2) Mozgatás: O(n2)
Eljárás Rendezés(N, A)
i ←←←← N
Ciklus amíg i ≥≥≥≥ 2
CS ←←←← 0
Ciklus j ←←←← 1-től i-1-ig
Ha A[j] > A[j+1] akkor
A[j] ↔↔↔↔ A[j+1]
CS ←←←← j
Elágazás vége
Ciklus vége
i ←←←← CS
Ciklus vége
Eljárás vége
8
Beillesztéses rendezés
Tárigény: N+1 Hasonlítás: O(n2) Mozgatás: O(n2)
Eljárás Rendezés(N, A)
Ciklus i ←←←← 2-től N-ig
j ←←←← i-1
Ciklus amíg (j ≥≥≥≥ 0) és (A[j] > A[j+1])
A[j] ↔↔↔↔ A[j+1]
j ←←←← j - 1
Ciklus vége
Ciklus vége
Eljárás vége
9
Javított beillesztéses rendezés
Tárigény: N+1 Hasonlítás: O(n2) Mozgatás: O(n2)
Eljárás Rendezés(N, A)
Ciklus i ←←←← 2-től N-ig
j ←←←← i-1
Y ←←←← A[i]
Ciklus amíg (j ≥≥≥≥ 0) és (A[j] > Y)
A[j+1] ←←←← A[j]
j ←←←← j - 1
Ciklus vége
A[j+1] ←←←← Y
Ciklus vége
Eljárás vége
10
Témakörök
Alapvető összehasonlító rendezésekShell rendezés
KupacrendezésLeszámláló rendezés
Radix rendezésEdényrendezés
11
Shell rendezés
Eljárás Rendezés(N, A, L0)
L ←←←← L0
Ciklus amíg L ≥≥≥≥ 1
Ciklus k ←←←← L+1-től 2*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
Ciklus vége
A[j + L] ←←←← y
Ciklus vége
Ciklus vége
L ←←←← Következő_L(L)
Ciklus vége
Elágazás végeLépésszám: O(n*log2n)
12
Témakörök
Alapvető összehasonlító rendezésekShell rendezés
KupacrendezésLeszámláló rendezés
Radix rendezésEdényrendezés
13
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
• Fa – kupac megfeleltetés– Szülő(i) : i / 2– Bal(i) : 2 * i– Jobb(i) : 2 * i + 1
1 2 3 4 5
1
2 3
54
14
Kupac tulajdonság
• Kupac tulajdonság: A kupac minden i, gyökértől különböző eleme esetén:
A[Szülő(i)] ≥ A[i]• 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 kisebbvagy egyenlő értékek találhatók.
• Ez nem azonos a tanult bináris keresőfaadatszerkezettel! 20
18 14
168
15
Kupactulajdonság fenntartása
• Kupacol:
• Feltételezzük, hogy a bal és jobb oldali részfák kupac szerkezetűek. Ha A[i] kisebb valamelyik gyerekénél, akkor megsérti a kupactulajdonságot.
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[MAX]
Kupacol(A, MAX, N)
Elágazás vége
Eljárás vége
16
Kupac építése
• Kupacot-épít:
• Az A tömböt alulról felfelé haladva kupaccá alakítjuk
• Az N/2-től N-ig terjedő index elemek levelek, tehát egy elemű (a kupactulajdonságot teljesítő) fáknaktekinthetőek, így csak a többi csúcsot kell ellenőrizni
• A feldolgozás sorrendje garantálja a Kupacol eljáráselőfeltételét
Eljárás Kupacot-épít(A)
N ←←←← Tömb_méret(A)
Ciklus i ←←←← N/2-től 1-ig
Kupacol(A, i, N)
Ciklus vége
Eljárás vége
17
A kupacrendezés
• Kupacrendezés:
• A kupacban a gyökérelem 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
Eljárás Kupacrendezés(A)
Kupacot-épít(A)
Ciklus i ←←←← N-től 2-ig
A[1] ↔↔↔↔ A[i]
N ←←←← N – 1
Kupacol(A, 1, N)
Ciklus vége
Eljárás vége
18
Kupacba beszúrás
• Kupacba-beszúr:
• 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
Eljárás Kupacba-beszúr(A, kulcs)
N ←←←← N + 1
i ←←←← N
Ciklus amíg (i > 1) és (A[Szülő(i)] < kulcs)
A[i] ←←←← A[Szülő(i)]
i ←←←← Szülő(i)
Ciklus vége
A[i] ←←←← kulcs
Eljárás vége
19
Kupacrendezés elemzése
• A kupacrendezés futási ideje: O(n*lgn)• Összehasonlító rendezés• Műveletei:
• Beszúrás• Maximum• Kivesz-maximum• Kupacba-beszúr
• Gyakorlati alkalmazása: elsőbbségi sorok
20
Témakörök
Alapvető összehasonlító rendezésekShell rendezés
KupacrendezésLeszámláló rendezés
Radix rendezésEdényrendezés
21
Szétosztó rendezés
• Feltételezzük, hogy a kulcsok 1 és N közötti egész számok, és nincs két azonos kulcsú rekord
• 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
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
22
Leszámláló rendezés
Eljárás Leszámláló-rendezés(A, 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)
23
Leszámláló rendezés - bemenet
2 Peti3 Kati1 Feri4 Mari1 Mici5 Laci1 Móni1 Pali4 Béni5 Sanyi2 Tóni3 Teri
A BC
24
Leszámláló rendezés – 1. lépés
4
2
2
2
2
C2 Peti3 Kati1 Feri4 Mari1 Mici5 Laci1 Móni1 Pali4 Béni5 Sanyi2 Tóni3 Teri
A B
25
Leszámláló rendezés – 2. lépés
A B
4
6
8
10
12
C2 Peti3 Kati1 Feri4 Mari1 Mici5 Laci1 Móni1 Pali4 Béni5 Sanyi2 Tóni3 Teri
26
Leszámláló rendezés – 3. lépés
B
4
6
7
10
12
C2 Peti3 Kati1 Feri4 Mari1 Mici5 Laci1 Móni1 Pali4 Béni5 Sanyi2 Tóni3 Teri
3 Teri
A
27
Leszámláló rendezés – 3-2. lépés
B
4
5
7
10
12
C2 Peti3 Kati1 Feri4 Mari1 Mici5 Laci1 Móni1 Pali4 Béni5 Sanyi2 Tóni3 Teri
2 Tóni
3 Teri
A
28
Leszámláló rendezés – 3-N. lépés
B
0
4
6
8
10
C2 Peti3 Kati1 Feri4 Mari1 Mici5 Laci1 Móni1 Pali4 Béni5 Sanyi2 Tóni3 Teri
1 Feri1 Mici1 Móni1 Pali2 Peti2 Tóni3 Kati3 Teri4 Mari4 Béna5 Laci5 Sanyi
A
Stabil: megtartja az azonos kulcsú elemek sorrendjét!
29
Témakörök
Alapvető összehasonlító rendezésekShell rendezés
KupacrendezésLeszámláló rendezés
Radix rendezésEdényrendezés
30
Radix (számjegyes) rendezés
• Radix rendezés
• 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)
Eljárás Radix-rendezés(A, D)
Ciklus j ←←←← 1-től D-ig
{Stabil rendezés az i. „számjegyen”}
Ciklus vége
Eljárás vége
31
Radix rendezés menete
Eredeti 1. lépés 2. lépés 3. lépés
412
657
542
211
457
554
154
551
151
154
134
382
211
551
151
412
542
382
554
154
154
134
657
457
211
412
134
542
551
151
554
154
154
657
457
382
134
151
154
154
211
382
412
457
542
551
554
657
32
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!
33
Témakörök
Alapvető összehasonlító rendezésekShell rendezés
KupacrendezésLeszámláló rendezés
Radix rendezésEdényrendezés
34
Edényrendezés
• EdényrendezésEljárás Edény-rendezés(A, N)
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(C, B[i])
Ciklus vége
Eljárás vége
35
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 intervallumonIdeá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ó
36
Javasolt/felhasznált irodalom
• Cormen, Leiserson, Rivest: AlgoritmusokMűszaki Könyvkiadó, 1997
• Pap, Szlávi, Zsakó: µlógia34 – Módszeres programozásELTE TTK, 2002
• Knuth: A számítógép programozás művészete 3.Műszaki Könyvkiadó, 1988