Algoritmusok és adatszerkezetek kezdőknek válogató

Algoritmusok és adatszerkezetek kezdőknek válogató

Ebben a részben megnézzük az öt alapvető algoritmusok válogatás adatok a tömbben. Kezdjük a legegyszerűbb - buborék sort - és befejezni a „quick sort» (gyorskeresés).

Minden algoritmus, amellett, hogy magyarázatot munkája, mi is rámutatnak a memóriát, és időbonyolultsága a legrosszabb, a legjobb és az átlagos esetben.

Swap eljárás

Hogy egyszerűsítse a kódot, és az olvashatóság javítása érdekében bemutatjuk Swap módszer. amely cserélni a tömb elemeinek indexszel.

Bubble sort - a legegyszerűbb rendezési algoritmus. Ez áthalad a tömb többször minden szakaszában mozgó legfontosabb szétválogatott a tömb végéig.

Például, van egy sor egész:

Az első áthaladás a tömb, összehasonlítjuk az értékek 3 és 7 7. óta nagyobb, mint 3, akkor hagyjuk őket, ahogy vannak. Aztán össze a 7. és 4. A 4 kisebb, mint 7, ezért átrendezheti őket húzással a hét egyik közelebb van a végén a tömb. Most úgy néz ki, mint ez:

Ez a folyamat ismétlődik, amíg a hét nem jön, amíg majdnem a végén a tömb. A végén azt összehasonlítjuk egy elem 8, amely nagyobb, és ezért nincs megosztás. Miután körbejártuk a tömb egyszer, ez így néz ki:

Amint azt már legalább egy értékek cseréjét, meg kell, hogy menjen át a tömböt újra. Ennek eredményeként ez a szakasz, áttérünk a helyet a 6 szám.

És ott ismét elő legalább egy csere, és így halad át a tömb újra.

A következő csere átjáró nem kerül sor, ami azt jelenti, hogy a tömb rendezve, és az algoritmus befejezte munkáját.

Beszúrási sort fut, áthalad a tömb és mozog a kívánt érték a tömb elején. A feldolgozás után a következő pozícióba, tudjuk, hogy az összes elem előtte válogatni, és utána - nem.

Egy fontos pont: beszúrásos rendezés kezeli az elemek a tömb érdekében. Mivel az algoritmus fut az elemek balról jobbra, tudjuk, hogy minden, ami maradt az aktuális index - már rendezve. Ezen az ábrán azt mutatjuk be, részeként a tömb rendezve növekszik minden menetben:

Algoritmusok és adatszerkezetek kezdőknek válogató

Fokozatosan rendezve része a tömb növekszik, és a végén, a tömb lesz rendelhető.

Nézzünk egy konkrét példát. Itt a rendezetlen tömb hogy fel fogjuk használni:

Az algoritmus kezdődik index értéke 0 és 3 Mivel ez az első index a tömb előtt tartják, hogy befogadó sorrendje.

Ezután térjünk vissza a 7-es számú 7. óta nagyobb, mint bármely értéket a válogatott darabokat, akkor folytassa a következő elem.

Ebben a szakaszban az elemek indexek 0..1 vannak rendezve, hanem az elemek indexek 2..n nem ismert.

Meg kell ellenőrizni az érték 4. Mivel ez kevesebb, mint hét, meg kell mozgatni, hogy a megfelelő pozícióba a rendezett része a tömbben. A kérdés marad: hogyan határozza meg ez? Ezt úgy érjük el FindInsertionIndex. Ez összehasonlítja az érték átadott (4) minden érték a rendezett részét, amíg nem talál helyet beilleszteni.

Tehát megtaláltuk az index 1 (értékek 3 és 7 között). Insert eljárás végrehajtja egy betétet, távolítsa el betétet érték a tömb, és igyekszik az összes értéket az index beszúrni, jobbra. Most a tömb így néz ki:

Most, részben a tömb, nullától kezdve és befejezve az elem indexű elem 2 rendezve. Következő járat kezdődik az index a 3. és 4. értéke az algoritmus, továbbra is ilyen szerelést.

Ha nincs több hely a betétek, a tömb tekinthető teljes egészében osztályozni kell, és az algoritmus befejeződik.

Válogatás Rendezés - ez egy hibrid között egy buborék és behelyezése sort. Mint a buborék rendezés, az algoritmus átmegy a tömb újra és újra, mozgó egy értéket a megfelelő helyzetbe. Azonban, ellentétben a buborék rendezés, kiválasztja a legkisebb érték helyett a maximális osztályozatlan. Ahogy a beillesztés sort, rendezett részén a tömb elején található, míg a buborék rendezés, ő a végén.

Nézzük meg a rendezési műveletet kínálatunk szétválogatott tömb.

Az első áthaladnak az algoritmus FindIndexOfSmallestFromIndex módszer megpróbálja megtalálni a legkisebb érték a tömbben, és mozgassa a csúcsra.

Miután egy ilyen kis tömb, azt mondhatjuk, hogy egyszerre a legalacsonyabb érték - 3, és ez már a megfelelő pozícióban. Ebben a szakaszban, tudjuk, hogy az első helyen a array (0 index) a legkisebb érték, ezért az elején a tömb már rendezve. Ezért kezdődik a második menetben - ezúttal az indexek 1-től n - 1.

A második menetben, úgy ítéljük meg, hogy a legkisebb érték - 4. Mi változik a helyét a második elem, egy hét, majd 4 emelkedik a megfelelő helyzetben.

Most az osztályozatlan része a tömb kezdődik index 2. A nő egy elemet minden egyes alkalommal át az algoritmust. Ha bármilyen folyosón, nem tettünk semmilyen csere, ami azt jelenti, hogy a tömb rendezve.

Miután két menetben az algoritmus leáll:

Oszd meg és uralkodj

Eddig tekinthető lineáris algoritmusokat. Ők egy kis extra memória, de van egy másodfokú bonyolultságát. A példa egyesítés rendezési algoritmusnak, nézzük, hogy milyen típusú „oszd meg és uralkodj» (oszd meg és uralkodj).

Ha meg akarja találni egy személy nevét Petrov, akkor nem keres, kezdve az A betű, és fordult egy oldalon. Ön valószínűleg felfedezni egy könyvet valahol. Ha ön kap a T betű, perelistnete néhány oldalt vissza, talán túl sok -, hogy a levél A. Akkor menj előre. Így essek oda-vissza az összes kevesebb oldalt akkor előbb-utóbb megtalálja a megfelelő.

Mennyire hatékonyak ezek az algoritmusok?

egyesítése Sort

Amikor mergesort elosztjuk a tömb fele olyan hosszú, mint minden részén nem lesz egyik eleme hosszú. Akkor ezeket a területeket vissza a helyére (merge) a megfelelő sorrendben.

Nézzük meg egy tömböt:

Osszuk ketté:

És mi fog osztani az egyes részek a felére, amíg része marad az egyik eleme:

Most, hogy már osztva tartományban a lehető legrövidebb nak mi egyesíti őket a megfelelő sorrendben.

Algoritmusok és adatszerkezetek kezdőknek válogató

Először is kap csoportok két sorba rendezett elem, akkor a „gyűjteni” őket négyes csoportokba, és a végén összegyűjti az összes együtt, egy rendezett tömbben.

Algoritmusok és adatszerkezetek kezdőknek válogató

Az algoritmus végre kell hajtania a következő műveleteket:

  1. A művelet rekurzív felosztása a tömb csoportokba (rendezése módszer).
  2. Fúziós a megfelelő sorrendben (Merge módszer).

Érdemes megjegyezni, hogy ellentétben a lineáris rendezési algoritmusok, összeolvad rendezés osztani és az illesztési tömb, függetlenül attól, hogy eredetileg nem vagy rendezve. Ezért annak ellenére, hogy a legrosszabb esetben ez működni fog gyorsabb, mint a lineáris, a legjobb, a teljesítmény kisebb lesz, mint a sorban. Ezért az egyesítés sort - nem a legjobb megoldás, ha meg kell rendezni a tömb részben uporyadchenny.

public void Sort (T [] elem)

if (leftIndex gt; = Bal. hossz)

tételek [targetIndex] = jobbra [rightIndex ++];

else if (rightIndex gt; = Jobb. hossz)

tételek [targetIndex] = balra [leftIndex ++];

else if (balra [leftIndex]. CompareTo (jobb [rightIndex]) lt; 0)

tételek [targetIndex] = balra [leftIndex ++];

tételek [targetIndex] = jobbra [rightIndex ++];

quicksort

Gyors rendezés - egy másik algoritmus, mint a „oszd meg és uralkodj”. Úgy működik, hogy rekurzívan megismételjük a következő lépéseket:

  1. Válassza ki a kulcs index és oszd el a tömb két részre. Ezt meg lehet tenni a különböző módon, de ebben a cikkben használjuk egy véletlen számot.
  2. Mozgás minden eleme a gomb jobb oldalán a tömb, és az elemek kisebb, mint a legfontosabb - a bal oldalon. Most, a legfontosabb elem a megfelelő helyzetben - ez több, mint bármely elemét a bal és a jobb alsó bármely tétel.
  3. Ismételje meg az első két lépést, amíg tömb teljesen rendezve.

Nézzük meg az algoritmus a következő tömböt:

Először is, véletlenszerűen választja ki a kulcsfontosságú:

int pivotIndex = _pivotRng. Következő (balra jobbra.);

Most, hogy tudjuk, hogy a kulcs index (4) vesszük azt az értéket, amely index (6), és vigyük át a tömb elemeinek, hogy minden szám nagyobb vagy egyenlő kulcs van a jobb oldalon, és az összes számot kevesebb, mint a legfontosabb -, hogy a bal oldali . Felhívjuk figyelmét, hogy az átvitel során az index értéke kulcseleme változhat (amint azt hamarosan látni fogjuk).

Mozgó értékek végzett partíció módszer.

Ebben a szakaszban, tudjuk, hogy az értéke 6, a jobb oldalon. Most ismételjük meg az eljárást a bal és jobb oldalán a tömbben.

Felhívjuk a módszer quicksort rekurzívan az egyes részek. A legfontosabb eleme a bal oldalon lesz öt. Ha mozgatja az értékeket meg fog változni az index. A legfontosabb dolog - ne feledjük, hogy fontos ez a legfontosabb, nem az index.

Ismét alkalmazza a gyors rendezés:

Mi balra egy szétválogatott értéket, mert tudjuk, hogy minden mást rendezve, az algoritmus véget ér.