Triedenie vkladaním (insertion sort)

  • Informatika
  • algoritmus triedenia
  • časová zložitosť
  • stabilita algoritmu
  • pseudokód triedenia…
  • výhody triedenia vkladaním
  • triediace algoritmy…

Podcast

Triedenie vkladaním: Ako triediť karty (a dáta)0:00 / 9:50
0:001:00 zostáva

Triedenie vkladaním, známe aj pod anglickým názvom Insertion Sort, je jedným z najzákladnejších a najintuitívnejších triediacich algoritmov. Jeho princíp je ľahko pochopiteľný a často sa používa ako úvod do štúdia triediacich algoritmov v informatike. Hoci pre veľké dátové sady nie je tak efektívny ako niektoré zložitejšie algoritmy, má svoje výhody, najmä pre malé množiny dát alebo pre dáta, ktoré sú už čiastočne usporiadané.

Čo je Triedenie vkladaním (Insertion Sort)?

Najlepšie si princíp triedenia vkladaním predstavíme na analógii s triedením kariet v ruke. Predstavte si, že držíte balíček neusporiadaných kariet a chcete ich usporiadať od najmenšej po najväčšiu. Začnete s prvou kartou, ktorú považujete za už usporiadanú (je to jediná karta, takže je usporiadaná sama o sebe).

Potom vezmete druhú kartu a porovnáte ju s prvou. Ak je menšia, vložíte ju pred prvú. Ak je väčšia, necháte ju za prvou. Takto máte usporiadané prvé dve karty. Následne vezmete tretiu kartu a nájdete pre ňu správne miesto medzi už usporiadanými dvoma kartami, posúvajúc väčšie karty doprava, aby ste uvoľnili priestor. Tento proces opakujete pre každú ďalšiu kartu, kým všetky karty nie sú na svojom správnom mieste a celý balíček nie je usporiadaný.

Algoritmus triedenia vkladaním funguje na podobnom princípe. Pole, ktoré chceme usporiadať, je rozdelené na dve logické časti: usporiadanú (ľavú) a neusporiadanú (pravú). Na začiatku je usporiadaná časť tvorená iba prvým prvkom poľa, zatiaľ čo zvyšok poľa tvorí neusporiadanú časť. V každej iterácii algoritmus vezme prvý prvok z neusporiadanej časti (nazývaný „kľúč“) a postupne ho vkladá na správne miesto do už usporiadanej časti. Aby sa pre kľúč uvoľnilo miesto, prvky v usporiadanej časti, ktoré sú väčšie ako kľúč, sa posúvajú o jednu pozíciu doprava.

Over si, čo už vieš

Test · 20 otázok · prvé 3 zadarmo

Otázka 1 z 30%

Premenná 'j' vo vnútornom cykle triedenia vkladaním sa zväčšuje o 1, aby sa posunula k predchádzajúcemu prvku v usporiadanej časti.

Precvič si to na kartičkách

14 kartičiek · prvé 3 zadarmo bez účtu

1 / 14

Čo je to triedenie vkladaním?

Triedenie vkladaním (Insertion Sort) je jeden z najzákladnejších a najintuitívnejších triediacich algoritmov, ktorého princíp je ľahko pochopiteľný a

Ťukni na otočenie · Potiahni na navigáciu

Ako funguje algoritmus Triedenia vkladaním (Insertion Sort)?

Princíp triedenia vkladaním je založený na postupnom vkladaní prvkov z neusporiadanej časti poľa do správnej pozície v už usporiadanej časti.

Podrobný algoritmus Triedenia vkladaním

Nech máme pole A s n prvkami, ktoré chceme usporiadať vzostupne:

  1. Predpokladáme, že prvý prvok poľa A[0] je už usporiadaný. Usporiadaná časť poľa je teda A[0].
  2. Začneme cyklus od druhého prvku (index i = 1) až po posledný prvok (index n-1).
  3. V každej iterácii cyklu si vezmeme aktuálny prvok A[i] a uložíme ho do dočasnej premennej kľúč. Tento kľúč je prvok, ktorý chceme vložiť do usporiadanej časti.
  4. Nastavíme premennú j na hodnotu i - 1. j bude ukazovať na posledný prvok usporiadanej časti poľa.
  5. Spustíme vnútorný cyklus (alebo opakované porovnávanie), ktorý bude prebiehať, pokiaľ j je väčšie alebo rovné 0 a prvok A[j] je väčší ako kľúč.
  • V tomto vnútornom cykle posúvame prvok A[j] o jednu pozíciu doprava (t.j., A[j+1] = A[j]).
  • Zmenšujeme hodnotu j o 1 (t.j., j = j - 1), aby sme sa posunuli k predchádzajúcemu prvku v usporiadanej časti.
  1. Keď vnútorný cyklus skončí (buď sme našli prvok menší alebo rovný kľúču, alebo sme dosiahli začiatok poľa), vložíme kľúč na voľné miesto, ktoré vzniklo posúvaním (t.j., A[j+1] = kľúč).
  2. Opakujeme kroky 3-6 pre všetky prvky od i = 1 po n-1.

Príklad Triedenia vkladaním (Insertion Sort) s číslami

Usporiadajme pole: [5, 2, 4, 6, 1, 3]

  • Počiatočný stav: [5 | 2, 4, 6, 1, 3] (Usporiadaná časť: [5])

  • Iterácia i = 1 (kľúč = 2):

  • j = 0, A[0] = 5. Je 5 > 2? Áno.

  • Posuň 5 doprava: [_, 5 | 4, 6, 1, 3]

  • j = -1. Vnútorný cyklus končí.

  • Vlož kľúč (2) na A[0]: [2, 5 | 4, 6, 1, 3]

  • Iterácia i = 2 (kľúč = 4):

  • j = 1, A[1] = 5. Je 5 > 4? Áno.

  • Posuň 5 doprava: [2, _, 5 | 6, 1, 3]

  • j = 0, A[0] = 2. Je 2 > 4? Nie.

  • Vnútorný cyklus končí.

  • Vlož kľúč (4) na A[1]: [2, 4, 5 | 6, 1, 3]

  • Iterácia i = 3 (kľúč = 6):

  • j = 2, A[2] = 5. Je 5 > 6? Nie.

  • Vnútorný cyklus končí (kľúč je už na správnom mieste).

  • Vlož kľúč (6) na A[3]: [2, 4, 5, 6 | 1, 3]

  • Iterácia i = 4 (kľúč = 1):

  • j = 3, A[3] = 6. Je 6 > 1? Áno. Posuň 6 doprava: [2, 4, 5, _, 6 | 3]

  • j = 2, A[2] = 5. Je 5 > 1? Áno. Posuň 5 doprava: [2, 4, _, 5, 6 | 3]

  • j = 1, A[1] = 4. Je 4 > 1? Áno. Posuň 4 doprava: [2, _, 4, 5, 6 | 3]

  • j = 0, A[0] = 2. Je 2 > 1? Áno. Posuň 2 doprava: [_, 2, 4, 5, 6 | 3]

  • j = -1. Vnútorný cyklus končí.

  • Vlož kľúč (1) na A[0]: [1, 2, 4, 5, 6 | 3]

  • Iterácia i = 5 (kľúč = 3):

  • j = 4, A[4] = 6. Je 6 > 3? Áno. Posuň 6 doprava: [1, 2, 4, 5, _, 6]

  • j = 3, A[3] = 5. Je 5 > 3? Áno. Posuň 5 doprava: [1, 2, 4, _, 5, 6]

  • j = 2, A[2] = 4. Je 4 > 3? Áno. Posuň 4 doprava: [1, 2, _, 4, 5, 6]

  • j = 1, A[1] = 2. Je 2 > 3? Nie.

  • Vnútorný cyklus končí.

  • Vlož kľúč (3) na A[2]: [1, 2, 3, 4, 5, 6]

Výsledok: Pole je usporiadané: [1, 2, 3, 4, 5, 6]

Analýza časovej zložitosti Triedenia vkladaním (Insertion Sort)

Časová zložitosť algoritmu triedenia vkladaním závisí od počiatočného usporiadania vstupného poľa. Je dôležitá pre pochopenie výkonu algoritmu v rôznych scenároch.

Najlepší prípad: O(n)

Nastáva, keď je vstupné pole už usporiadané. V každej iterácii vonkajšieho cyklu (pre i od 1 do n-1) sa kľúč porovná len s jedným prvkom (A[j]) a zistí sa, že je už na správnom mieste. Vnútorný cyklus sa teda vykoná len raz pre každú iteráciu vonkajšieho cyklu. Celkový počet operácií je približne n porovnaní, čo vedie k lineárnej časovej zložitosti O(n), kde n je počet prvkov v poli.

Najhorší prípad: O(n²)

Nastáva, keď je vstupné pole usporiadané v opačnom poradí (napríklad zostupne, ak triedime vzostupne). V tomto prípade musí byť každý kľúč posunutý cez celú usporiadanú časť poľa, aby sa dostal na svoje správne miesto. Pre prvok na pozícii i sa vykoná približne i porovnaní a i posunov. Suma operácií pre všetky prvky je 1 + 2 +... + (n-1), čo je približne n²/2. To vedie ku kvadratickej časovej zložitosti O(n²).

Priemerný prípad: O(n²)

Pre náhodne usporiadané pole je priemerná časová zložitosť tiež O(n²). V priemere sa každý kľúč musí posunúť cez polovicu už usporiadanej časti poľa.

Pre takmer usporiadané dáta: O(n)

Triedenie vkladaním je mimoriadne efektívne pre dáta, ktoré sú už takmer usporiadané. V takom prípade sa každý prvok musí posunúť len o malý počet pozícií, alebo vôbec. Počet posunov a porovnaní je potom blízky lineárnemu počtu, čo vedie k časovej zložitosti blízkej O(n).

Charakteristika a implementácia Triedenia vkladaním (Insertion Sort)

Okrem časovej zložitosti je dôležité poznať aj ďalšie vlastnosti tohto algoritmu.

Stabilita algoritmu

Algoritmus triedenia je stabilný, ak zachováva relatívne poradie rovnakých prvkov. To znamená, že ak sú v pôvodnom poli dva rovnaké prvky (napr. dve čísla 5), a jeden z nich sa objavil pred druhým, v usporiadanom poli sa ich relatívne poradie nezmení. Triedenie vkladaním je stabilný algoritmus.

Dôvodom je, že prvok kľúč sa posúva len vtedy, ak je prvok v usporiadanej časti striktne väčší ako kľúč. Ak sú si rovné, kľúč sa vloží za existujúci rovnaký prvok, čím sa zachová ich pôvodné poradie.

Pseudokód implementácie Triedenia vkladaním

PROCEDÚRA TriedenieVkladaním(pole A, n)
 PRE i OD 1 DO n-1
 kľúč = A[i]
 j = i - 1
 KÝM j >= 0 A A[j] > kľúč
 A[j+1] = A[j]
 j = j - 1
 KONIEC KÝM
 A[j+1] = kľúč
 KONIEC PRE
KONIEC PROCEDÚRY

Bežné chyby a praktické využitie Triedenia vkladaním

Je dôležité poznať aj možné úskalia a optimálne scenáre pre použitie tohto algoritmu.

Jednou z častých chýb je nesprávne pochopenie, kedy sa prvky posúvajú. Prvky sa posúvajú doprava len vtedy, ak sú väčšie ako kľúč. Ak by sa posúvali aj pri rovnosti, algoritmus by nebol stabilný. Ďalšou mylnou predstavou je, že triedenie vkladaním je vždy pomalé. Hoci jeho najhoršia a priemerná zložitosť je O(n²), pre malé dátové sady (typicky do niekoľkých desiatok prvkov) alebo takmer usporiadané dáta môže byť v praxi rýchlejší ako zložitejšie algoritmy s lepšou asymptotickou zložitosťou (napr. Quick Sort alebo Merge Sort) kvôli menšej konštantnej réžii.

Pochopenie Triedenia vkladaním pomocou simulácie

Vizualizácia je kľúčová pre hlbšie pochopenie algoritmov. Ako funguje interaktívna simulácia triedenia vkladaním?

V interaktívnej simulácii má študent možnosť vizuálne sledovať každý krok algoritmu. Kľúčovou aktivitou je „krokovanie vkladania kľúča“. Študent môže pozorovať, ako sa vyberie nový prvok (kľúč) z neusporiadanej časti a ako sa postupne porovnáva s prvkami v usporiadanej časti. Pri každom porovnaní môže vidieť, ako sa väčšie prvky posúvajú doprava, aby sa uvoľnilo miesto pre kľúč. Následne je kľúč vložený na svoje správne miesto.

Táto vizualizácia pomáha pochopiť:

  • Postupný rast usporiadanej časti: Ako sa usporiadaná časť poľa zväčšuje o jeden prvok v každej iterácii.
  • Mechanizmus posúvania: Prečo a ako sa prvky posúvajú, a prečo je to dôležité pre správne vloženie kľúča.
  • Vplyv počiatočného usporiadania: Experimentovaním s rôznymi počiatočnými usporiadaniami (náhodné, usporiadané, opačne usporiadané, takmer usporiadané) môže študent intuitívne pochopiť rozdiel v počte operácií a tým aj v časovej zložitosti algoritmu. Napríklad, pri už usporiadanom poli uvidí minimálny počet posunov a porovnaní, zatiaľ čo pri opačne usporiadanom poli uvidí maximálny počet posunov.
  • Stabilita v praxi: Ak simulácia používa prvky s dodatočnými identifikačnými znakmi (napr. farby alebo indexy), študent môže overiť, že relatívne poradie rovnakých prvkov zostáva zachované.

Možnosť krokovania a interaktívneho sledovania algoritmu je neoceniteľná pre hlbšie pochopenie jeho vnútorného fungovania a pre upevnenie teoretických znalostí o časovej zložitosti a stabilite.

Často kladené otázky o Triedení vkladaním (FAQ)

Prečo sa Triedenie vkladaním považuje za jeden z najintuitívnejších triediacich algoritmov?

Jeho princíp je veľmi podobný tomu, ako triedime balíček hracích kariet v ruke – postupne berieme jednu kartu a vkladáme ju na správne miesto medzi už usporiadané karty. Táto analógia uľahčuje pochopenie jeho základného fungovania.

Kedy je Triedenie vkladaním najefektívnejšie?

Triedenie vkladaním je najefektívnejšie pre malé dátové sady alebo pre dáta, ktoré sú už čiastočne usporiadané. V takýchto prípadoch dosahuje časovú zložitosť blízku O(n), čo je veľmi rýchle. Pre veľké neusporiadané súbory dát je menej efektívne než zložitejšie algoritmy.

Je Triedenie vkladaním stabilný algoritmus a čo to znamená?

Áno, triedenie vkladaním je stabilný algoritmus. Stabilita znamená, že ak existujú v pôvodnom poli dva rovnako hodnotné prvky, ich relatívne poradie sa po usporiadaní nezmení. To je zabezpečené tým, že prvok sa posúva len vtedy, ak je prvok v usporiadanej časti striktne väčší ako vkladaný kľúč.

Aká je časová zložitosť Triedenia vkladaním v najhoršom prípade?

V najhoršom prípade, keď je pole usporiadané v opačnom poradí, dosahuje Triedenie vkladaním časovú zložitosť O(n²). To znamená, že počet operácií rastie kvadraticky s počtom prvkov n v poli.

Precvič si to, nielen prečítaj

14 kartičiek, test s vysvetlením a podcast k tejto téme. Účet je zadarmo a pokračuješ tam, kde si skončil.

  • Bez platobnej karty
  • Web aj mobilná aplikácia
  • 330 000+ študentov
Začni zadarmo

Súvisiace témy