rendezesek ff

36
1 Haladó rendezések [email protected] PPT 2007/2008 tavasz http://nik.bmf.hu/ppt

Upload: rewion

Post on 03-Mar-2015

60 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Rendezesek Ff

1

Haladó rendezések

[email protected]

PPT 2007/2008 tavasz

http://nik.bmf.hu/ppt

Page 2: Rendezesek Ff

2

Témakörök

Alapvető összehasonlító rendezésekShell rendezés

KupacrendezésLeszámláló rendezés

Radix rendezésEdényrendezés

Page 3: Rendezesek Ff

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

Page 4: Rendezesek Ff

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

Page 5: Rendezesek Ff

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

Page 6: Rendezesek Ff

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

Page 7: Rendezesek Ff

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

Page 8: Rendezesek Ff

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

Page 9: Rendezesek Ff

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

Page 10: Rendezesek Ff

10

Témakörök

Alapvető összehasonlító rendezésekShell rendezés

KupacrendezésLeszámláló rendezés

Radix rendezésEdényrendezés

Page 11: Rendezesek Ff

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)

Page 12: Rendezesek Ff

12

Témakörök

Alapvető összehasonlító rendezésekShell rendezés

KupacrendezésLeszámláló rendezés

Radix rendezésEdényrendezés

Page 13: Rendezesek Ff

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

Page 14: Rendezesek Ff

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

Page 15: Rendezesek Ff

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

Page 16: Rendezesek Ff

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

Page 17: Rendezesek Ff

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

Page 18: Rendezesek Ff

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

Page 19: Rendezesek Ff

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

Page 20: Rendezesek Ff

20

Témakörök

Alapvető összehasonlító rendezésekShell rendezés

KupacrendezésLeszámláló rendezés

Radix rendezésEdényrendezés

Page 21: Rendezesek Ff

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

Page 22: Rendezesek Ff

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)

Page 23: Rendezesek Ff

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

Page 24: Rendezesek Ff

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

Page 25: Rendezesek Ff

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

Page 26: Rendezesek Ff

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

Page 27: Rendezesek Ff

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

Page 28: Rendezesek Ff

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!

Page 29: Rendezesek Ff

29

Témakörök

Alapvető összehasonlító rendezésekShell rendezés

KupacrendezésLeszámláló rendezés

Radix rendezésEdényrendezés

Page 30: Rendezesek Ff

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

Page 31: Rendezesek Ff

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

Page 32: Rendezesek Ff

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!

Page 33: Rendezesek Ff

33

Témakörök

Alapvető összehasonlító rendezésekShell rendezés

KupacrendezésLeszámláló rendezés

Radix rendezésEdényrendezés

Page 34: Rendezesek Ff

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

Page 35: Rendezesek Ff

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ó

Page 36: Rendezesek Ff

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