Fő tartalom
Tantárgy/kurzus: Számítástudomány > 1. témakör
8. lecke: Összefésülő rendezés- Oszd meg és uralkodj algoritmusok
- Az összefésülő rendezés áttekintése
- Feladat: Az összefésülő rendezés megvalósítása
- Lineáris időben futó összefésülés
- Feladat: az összefésülés megvalósítása
- Az összefésülő rendezés elemzése
© 2024 Khan AcademyFelhasználási feltételekAdatkezelési tájékoztatóSüti figyelmeztetés
Az összefésülő rendezés áttekintése
Mivel az oszd meg és uralkodj technikát alkalmazzuk, el kell döntenünk, mik legyenek a részfeladatok. A teljes feladat egy egész tömb rendezése. Mondjuk azt, hogy a részfeladat egy résztömb rendezése lesz. Úgy fogjuk meghatározni a részfeladatot, hogy abban egy résztömböt egy indextől egy indexig fogjuk rendezni. A könnyebbség kedvéért vezessünk be egy jelölésmódot egy adott résztömb megjelölésére, jelölje elemű tömb rendezését megfogalmazhatjuk úgy, hogy rendezni szeretnénk
array[p..r]
az array
tömb fent kijelölt résztömbjét. Fontos tudni, hogy ez a „kétpontos” jelölés nem egy érvényes JavaScript jelölésrendszer: csak az algoritmus leírásának megkönnyítése kedvéért alkalmazzuk, nem a programkód egy megvalósítását céloztuk meg. Jelölésrendszerünk felhasználásával azt mondhatjuk, hogy egy array[0..n-1]
-et.Így használja az összefésülő rendezés az oszd-meg-és-uralkodj elvet:
- Oszd meg úgy, hogy kiszámolod a
és között félúton található -t. Ezt ugyanúgy csináld, mint ahogy a bináris keresésnél határoztad meg a középpontot: add össze -t és -et, oszd el 2-vel, és kerekítsd lefelé. - Uralkodj úgy, hogy rekurzívan rendezed a felosztás során keletkezett két résztömböt. Azaz rendezd rekurzívan az
array[p..q]
résztömböt, és rendezd rekurzívan azarray[q+1..r]
résztömböt! - Fésüld össze úgy, hogy a rendezett résztömböket egyetlen rendezett
array[p..r]
tömbbe egyesíted.
Kell egy alapeset. Az alapeset a kettőnél kevesebb elemet tartalmazó résztömb lesz, azaz amikor , mivel az üres vagy a csak egy elemet tartalmazó résztömb már rendezett. Tehát megosztani-uralkodni-összefésülni csak akkor kell, amikor .
Nézzünk egy példát. Kezdjük a [14, 7, 3, 12, 9, 11, 6, 2]-t tartalmazó és ). Ennek a résztömbnek legalább két eleme van, úgyhogy ez nem alapeset.
array
tömbbel. Az első résztömb a teljes array[0..7]
tömb lesz (- Az oszd meg lépés során kiszámoljuk, hogy
. - Az uralkodj lépésben rendezni kellene a [14, 7, 3, 12]-t tartalmazó
array[0..3]
-t és a [9, 11, 6, 2]-t tartalmazóarray[4..7]
-t. Amikor visszatérünk az uralkodj lépésből, akkor már a két résztömb rendezett lesz:array[0..3]
tartalma [3, 7, 12, 14] ésarray[4..7]
tartalma [2, 6, 9, 11] lesz, a teljes tömb így fog kinézni: [3, 7, 12, 14, 2, 6, 9, 11]. - Végül a fésüld össze lépésben egyesítjük a tömb első és második felében található résztömböket, és megkapjuk a végeredményt: [2, 3, 6, 7, 9, 11, 12, 14].
Hogyan vált az és alapján kiszámoljuk -et, rekurzívan rendezzük
array[0..3]
résztömb rendezetté? Ugyanúgy. Kettő, vagy több elemet tartalmaz, azaz nem alapeset. array[0..1]
-t ([14, 7]) és array[2..3]
-t ([3, 12]), amiből megkapjuk array[0..3]
-t [7, 14, 3, 12] tartalommal. Összefésülve az első és második részt [3, 7, 12, 14]-et kapunk.Mitől lett az és alapján kiszámoljuk -t, rekurzívan rendezzük
array[0..1]
résztömb rendezett? array[0..0]
-t ([14]) és array[1..1]
-t ([7]), amiből megkapjuk array[0..1]
-t, változatlanul [14, 7] tartalommal. Összefésüljük az első és a második részt, így megkapjuk a [7, 14]-et. Az
array[0..0]
és array[1..1]
résztömbök alapesetek, mert mindkettőben kettőnél kevesebb elem található. Itt látható a teljes összefésülő rendezés folyamata:Az összefésülő rendezés legtöbb lépése egyszerű. Az alapeset könnyen ellenőrizhető. Az oszd meg lépésben a középpont megtalálása sem bonyolult. Az uralkodj lépésben két rekurzív hívásra van szükség. Az összefésülés lépésben történik az igazi munka, ahol a két rendezett résztömböt egyesíted.
A most következő feladatban az összefésülő algoritmus keretének implementálása lesz a cél, hogy biztosan megértsd, hogyan kell rekurzívan megosztani és uralkodni. Miután végeztél, részletesebben megvizsgáljuk, hogyan kell két rendezett résztömböt hatékonyan összefésülni, amit majd egy későbbi feladat során fogsz megvalósítani.
Ez a fejezet a Dartmouth Computer Science két professzora, Thomas Cormen és Devin Balkcom, valamint a Khan Academy informatika tanmenetfejlesztő csapatának együttműködésében készült. A tartalom a CC-BY-NC-SA licenc alatt engedélyezett.
Szeretnél részt venni a beszélgetésben?
Még nincs hozzászólás.