<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sk">
	<id>http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Filip+Tomek</id>
	<title>Kiwiki - Príspevky používateľa [sk]</title>
	<link rel="self" type="application/atom+xml" href="http://www.kiwiki.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Filip+Tomek"/>
	<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php/%C5%A0peci%C3%A1lne:Pr%C3%ADspevky/Filip_Tomek"/>
	<updated>2026-05-03T18:03:54Z</updated>
	<subtitle>Príspevky používateľa</subtitle>
	<generator>MediaWiki 1.34.0</generator>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13231</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13231"/>
		<updated>2021-04-19T15:56:06Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Heap Sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
''Heap Sort'' je triediaci algoritmus, ktorý podobne ako ''Selection sort'', rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus ''Heap Sort'', musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (''koreň'') je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (''uzol''), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (''uzol'') v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (vlastnosť ''MAX HEAP'' - ak triedime pole vzostupne, v opačnom prípade by sme použili ''MIN HEAP'').&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|Vizualizácia algoritmu ''Heapify'': Index ''i'' je iteračná premenná (pozri pseudokód). Ľavý a pravý potomok i-teho prvku je označený ako ''ĽP'' a ''PP''. Prvky zafarbené na modro vyjadrujú pravú podhromadu i-teho prvku a prvky zafarbené na zeleno vyjadrujú ľavú podhromadu i-teho prvku. Chronlogický postup algoritmu je znázornený číslicami 1 až 3.|699px|náhľad|vpravo]]&lt;br /&gt;
''Heapify'' je kľúčovým podprogramom triediaceho algoritmu ''Heap Sort'', vďaka ktorému vieme efektíve zabezpečiť procedúry: vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu ''Heapify'' spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady preusporiadame do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* '''dátová štruktúra:''' hromada (reprezentovaná ako: pole)&lt;br /&gt;
* '''časová zložitosť:''' lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* '''priestorová zložitosť:''' konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka i-teho prvku s maximálnou hodnotou.&lt;br /&gt;
# Porovnanie hodnoty maximálneho potomka s hodnotou rodiča (i-tym prvkom).&lt;br /&gt;
# Ak je hodnota maximálneho potomka väčšia ako hodnota rodiča, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastane výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme ''pole'' a index ''i'', v ktorom chceme vytvoriť hromadu (''Max Heap''). Musí byť splnená podmienka, že oba potomkovia i-teho prvku tvoria dve samostatné podhromady.&lt;br /&gt;
Najskôr skontrolujeme, či ''prvok'' na indexe ''i'' má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože ''i'' predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň aj jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe ''i''). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť '''iteračnú''' aj '''rekurzívnu''' verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;max = i&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je &amp;lt;code&amp;gt;lavy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[lavy] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::4.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::4.1. Pokračuj krokom 5. &lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::5.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::5.1. Pokračuj krokom 6. &lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 6.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 6.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 6.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
''Heap Sort'' pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a postupné mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus ''Heapify''.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* '''vhodný pre dátové štruktúry:''' pole &lt;br /&gt;
* '''časová náročnosť:''' vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|Vizualizácia priebehu algoritmu ''Heap Sort'': Algoritus je znázornený pomocou ''poľa'', ktoré triedime a binárnej hromady, ktorú dané pole reprezentuje. Indexy ''i'' a ''j'' sú sú iteračné premenné (pozri pseudokód). Indexy ľavého a pravého potomka i-teho prvku sú označené ako ''ĽP'' a ''PP''. Vrchol celej hromady je označený ako ''V''. Prvky zafarbené na modro vyjadrujú pravú podhromadu i-teho prvku a prvky zafarbené na zeleno vyjadrujú ľavú pohromadu i-teho prvku. Nevyfarbené prvky vyjadrujú prvky, ktoré boli zmazané. Chronologický priebeh je označený číslicami 1 až 12. |500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
* '''priestorová náročnosť:''' konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* '''druh triedenia:''' triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* '''stabilita triedenia:''' nestabilný&lt;br /&gt;
* '''miesto triedenia:''' vnútorné triedenie &lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Vytvorenie binárnej hromady z poľa.&lt;br /&gt;
# Zmazanie binárnej hromady.&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus ''Heapify'', pričom hromadu vytvoríme spôsobom zospodu na vrch. &lt;br /&gt;
&lt;br /&gt;
Najskôr si určíme rodiča posledného potomka. Využijeme rovnicu (3) z časti &amp;quot;Prehľad&amp;quot;, ktorú si jemne upravíme:&lt;br /&gt;
 &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič:} \ \  i = \left \lfloor \frac{\text{posledný index } - \ 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - \ 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme ''Heapify'' na podhromadu s vrcholom na indexe ''i''. Potom postupne zmenšujeme index ''i'' o ''1'' a opakovane naňho voláme ''Heapify'' až do chvíle, kým neprídeme na začiatok poľa. Touto procedúrou preusporiadavame spodné jednoprvkové podhromady do 3-prvkových podhromád, tie do 7-prvkových podhromád ... až kým nedostaneme jednu N-prvkovú hromadu, kde ''N'' je počet prvkov v poli. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{Heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na konci poľa považujeme už za zmazaný, preto veľkosť hromady znížime o 1. Ďalej, aby sme splnili podmienky pre maximálnu binárnu hromadu, zavoláme funkciu ''Heapify'' na celú hromadu (vrch hromady je 0-tý prvok v poli). Tento proces opakujeme, pokým v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: Pri triediacom algoritme nemusíme mazať celú hromadu, stačí nám, keď v hromade ostane jeden prvok, pretože vtedy bude vstupné pole už utriedené.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right ) : \ \  \text{Vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{Heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť '''iteračnú''' aj '''rekurzívnu''' verziu, čo závisí len od toho, ako je implementovaná funkcia ''Heapify''.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia ''Heap Sort'' má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. &amp;lt;code&amp;gt;i = i - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.3. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu: &amp;lt;code&amp;gt;Heapify(pole[], j, 0)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. &amp;lt;code&amp;gt;j = j - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.4. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int &amp;amp;a, int &amp;amp;b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;&amp;quot;Výsledné utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for(auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int &amp;amp;a, int &amp;amp;b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = a;&lt;br /&gt;
    a = b;&lt;br /&gt;
    b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(pole[max], pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(pole[0], pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortIT {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void heapify(int[] pole, int n) {&lt;br /&gt;
        for (int i = 1; i &amp;lt; n; i++) {&lt;br /&gt;
&lt;br /&gt;
            /* Ak je potomok väčší ako rodič */&lt;br /&gt;
            if (pole[i] &amp;gt; pole[(i - 1) / 2]) {&lt;br /&gt;
                int j = i;&lt;br /&gt;
&lt;br /&gt;
                /* Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok */&lt;br /&gt;
                while (pole[j] &amp;gt; pole[(j - 1) / 2]) {&lt;br /&gt;
                    swap(pole, j, (j - 1) / 2);&lt;br /&gt;
                    j = (j - 1) / 2;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void sort(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n);&lt;br /&gt;
&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            int j = 0, index;&lt;br /&gt;
&lt;br /&gt;
            /* Vymeň prvý a posledný prvok */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            do {&lt;br /&gt;
                index = 2 * j + 1;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka */&lt;br /&gt;
                if (index &amp;lt; i - 1 &amp;amp;&amp;amp; pole[index] &amp;lt; pole[index + 1])&lt;br /&gt;
                    index++;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu */&lt;br /&gt;
                if (index &amp;lt; i &amp;amp;&amp;amp; pole[j] &amp;lt; pole[index])&lt;br /&gt;
                    swap(pole, j, index);&lt;br /&gt;
&lt;br /&gt;
                j = index;&lt;br /&gt;
            } while (index &amp;lt; i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortIT hs = new HeapSortIT();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortRE {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            swap(pole, i, max);&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortRE hs = new HeapSortRE();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
&lt;br /&gt;
        # Ak je potomok väčší ako rodič&lt;br /&gt;
        if pole[i] &amp;gt; pole[int((i - 1) / 2)]:&lt;br /&gt;
            j = i&lt;br /&gt;
&lt;br /&gt;
            # Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok&lt;br /&gt;
            while pole[j] &amp;gt; pole[int((j - 1) / 2)]:&lt;br /&gt;
                pole[j], pole[int((j - 1) / 2)] = pole[int((j - 1) / 2)], pole[j]       # swap&lt;br /&gt;
                j = int((j - 1) / 2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole, n):&lt;br /&gt;
    heapify(pole, n)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
&lt;br /&gt;
        # Vymeň prvý a posledný prvok&lt;br /&gt;
        pole[0], pole[i] = pole[i], pole[0]     # swap&lt;br /&gt;
&lt;br /&gt;
        j, index = 0, 0&lt;br /&gt;
&lt;br /&gt;
        while True:&lt;br /&gt;
            index = 2 * j + 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka&lt;br /&gt;
            if index &amp;lt; (i - 1) and pole[index] &amp;lt; pole[index + 1]:&lt;br /&gt;
                index += 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu&lt;br /&gt;
            if index &amp;lt; i and pole[j] &amp;lt; pole[index]:&lt;br /&gt;
                pole[j], pole[index] = pole[index], pole[j]     # swap&lt;br /&gt;
&lt;br /&gt;
            j = index&lt;br /&gt;
&lt;br /&gt;
            if index &amp;gt;= i:&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
    sort(pole, n)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n, i):&lt;br /&gt;
    max = i     # rodic&lt;br /&gt;
    l = 2 * i + 1       # lavy potomok&lt;br /&gt;
    p = 2 * i + 2       # pravy potomok&lt;br /&gt;
&lt;br /&gt;
    # Ak je ľavý potomok väčší ako rodič&lt;br /&gt;
    if l &amp;lt; n and pole[max] &amp;lt; pole[l]:&lt;br /&gt;
        max = l&lt;br /&gt;
&lt;br /&gt;
    # Ak je pravý potomok väčší ako rodič&lt;br /&gt;
    if p &amp;lt; n and pole[max] &amp;lt; pole[p]:&lt;br /&gt;
        max = p&lt;br /&gt;
&lt;br /&gt;
    # Ak sa rodič v priebehu funkcie zmenil&lt;br /&gt;
    if max != i:&lt;br /&gt;
        pole[i], pole[max] = pole[max], pole[i]     # swap&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n, max)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    # Vytvorenie hromady&lt;br /&gt;
    for i in range(n // 2 - 1, -1, -1):&lt;br /&gt;
        heapify(pole, n, i)&lt;br /&gt;
&lt;br /&gt;
    # Extrahovanie jednotlivých elementov z hromady&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
        pole[i], pole[0] = pole[0], pole[i]     # swap&lt;br /&gt;
        heapify(pole, i, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&lt;br /&gt;
    sort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
[[Súbor:SelectionSort.png|600px|náhľad|vpravo|Vizualizácia algoritmu SelectionSort]]&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Selection Sort je triediaci algoritmus, ktorý si rozdelí pole na dve časti: zotriedenú a nezotriedenú. Následne opakovane vyberá minimum v nezotriedenej časti (ak triedime vzostupne), ktoré umiestni na koniec utrienej časti.&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy kvadratická &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, čo znamená, že algoritmus je určený na triedenie veľmi malých polí (rádovo 10, 20 prvkov), vďaka minimálnej réžii a jednoduchej implementácii, avšak pre väčšie polia sa stáva veľmi neefektívny&lt;br /&gt;
* priestorová náročnosť: vždy konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie&lt;br /&gt;
&lt;br /&gt;
===Základné časti algoritmu===&lt;br /&gt;
# Vonkajší cyklus: nastavenie hornej hranice utriedenej časti.&lt;br /&gt;
# Vnútorný cyklus: hľadanie minima ....&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech má funkcia Selection Sort nasledovný prototyp: &amp;lt;code&amp;gt;SelectionSort(pole[], dlzka)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;min = pole[0]&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech &amp;lt;code&amp;gt;i = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 3.1., inak skonči.&lt;br /&gt;
:::3.1. Nech: &amp;lt;code&amp;gt;j = i&amp;lt;/code&amp;gt;&lt;br /&gt;
:::3.2. Je &amp;lt;code&amp;gt; j &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 3.2.1. , inak skoč na krok 3.3. &lt;br /&gt;
:::::3.2.1. Je &amp;lt;code&amp;gt;pole[j] &amp;lt; min&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::3.2.1.1. &amp;lt;code&amp;gt;min = pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::::3.2.1.2. Skoč na krok 3.2.&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::3.2.1.1. Skoč na krok 3.2.&lt;br /&gt;
:::3.3. Vymeň: &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[min]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::3.4. Skoč na krok 3.2.&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
Heap Sort:&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;br /&gt;
&lt;br /&gt;
https://www.geeksforgeeks.org/heap-sort/&lt;br /&gt;
&lt;br /&gt;
https://www.geeksforgeeks.org/iterative-heap-sort/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=H5kAcmGOn4Q&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13228</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13228"/>
		<updated>2021-04-19T15:51:50Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Algoritmus Heap Sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
''Heap Sort'' je triediaci algoritmus, ktorý podobne ako ''Selection sort'', rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus ''Heap Sort'', musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (''koreň'') je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (''uzol''), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (''uzol'') v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (vlastnosť ''MAX HEAP'' - ak triedime pole vzostupne, v opačnom prípade by sme použili ''MIN HEAP'').&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|Vizualizácia algoritmu Heapify: Index i je iteračná premenná (pozri pseudokód). Ľavý a pravý potomok i-teho prvku je označený ako ĽP a PP. Prvky zafarbené na modro vyjadrujú pravú podhromadu i-teho prvku a prvky zafarbené na zeleno vyjadrujú ľavú podhromadu i-teho prvku. Chronlogický postup algoritmu je znázornený číslicami 1 až 3.|699px|náhľad|vpravo]]&lt;br /&gt;
''Heapify'' je kľúčovým podprogramom triediaceho algoritmu ''Heap Sort'', vďaka ktorému vieme efektíve zabezpečiť procedúry: vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu ''Heapify'' spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady preusporiadame do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* '''dátová štruktúra:''' hromada (reprezentovaná ako: pole)&lt;br /&gt;
* '''časová zložitosť:''' lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* '''priestorová zložitosť:''' konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka i-teho prvku s maximálnou hodnotou.&lt;br /&gt;
# Porovnanie hodnoty maximálneho potomka s hodnotou rodiča (i-tym prvkom).&lt;br /&gt;
# Ak je hodnota maximálneho potomka väčšia ako hodnota rodiča, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastane výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme ''pole'' a index ''i'', v ktorom chceme vytvoriť hromadu (''Max Heap''). Musí byť splnená podmienka, že oba potomkovia i-teho prvku tvoria dve samostatné podhromady.&lt;br /&gt;
Najskôr skontrolujeme, či ''prvok'' na indexe ''i'' má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože ''i'' predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň aj jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe ''i''). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť '''iteračnú''' aj '''rekurzívnu''' verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;max = i&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je &amp;lt;code&amp;gt;lavy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[lavy] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::4.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::4.1. Pokračuj krokom 5. &lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::5.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::5.1. Pokračuj krokom 6. &lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 6.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 6.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 6.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
''Heap Sort'' pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a postupné mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus ''Heapify''.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* '''vhodný pre dátové štruktúry:''' pole &lt;br /&gt;
* '''časová náročnosť:''' vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|Vizualizácia priebehu algoritmu Heap Sort: Algoritus je znázornený pomocou poľa, ktoré triedime a binárnej hromady, ktorú dané pole reprezentuje. Indexy i a j sú sú iteračné premenné (pozri pseudokód). Indexy ľavého a pravého potomka i-teho prvku sú označené ako ĽP a PP. Vrchol celej hromady je označený ako V. Prvky zafarbené na modro vyjadrujú pravú podhromadu i-teho prvku a prvky zafarbené na zeleno vyjadrujú ľavú pohromadu i-teho prvku. Nevyfarbené prvky vyjadrujú prvky, ktoré boli zmazané. Chronologický priebeh je označený číslicami 1 až 12. |500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
* '''priestorová náročnosť:''' konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* '''druh triedenia:''' triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* '''stabilita triedenia:''' nestabilný&lt;br /&gt;
* '''miesto triedenia:''' vnútorné triedenie &lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Vytvorenie binárnej hromady z poľa.&lt;br /&gt;
# Zmazanie binárnej hromady.&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus ''Heapify'', pričom hromadu vytvoríme spôsobom zospodu na vrch. &lt;br /&gt;
&lt;br /&gt;
Najskôr si určíme rodiča posledného potomka. Využijeme rovnicu (3) z časti &amp;quot;Prehľad&amp;quot;, ktorú si jemne upravíme:&lt;br /&gt;
 &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič:} \ \  i = \left \lfloor \frac{\text{posledný index } - \ 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - \ 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme ''Heapify'' na podhromadu s vrcholom na indexe ''i''. Potom postupne zmenšujeme index ''i'' o ''1'' a opakovane naňho voláme ''Heapify'' až do chvíle, kým neprídeme na začiatok poľa. Touto procedúrou preusporiadavame spodné jednoprvkové podhromady do 3-prvkových podhromád, tie do 7-prvkových podhromád ... až kým nedostaneme jednu N-prvkovú hromadu, kde ''N'' je počet prvkov v poli. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{Heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na konci poľa považujeme už za zmazaný, preto veľkosť hromady znížime o 1. Ďalej, aby sme splnili podmienky pre maximálnu binárnu hromadu, zavoláme funkciu ''Heapify'' na celú hromadu (vrch hromady je 0-tý prvok v poli). Tento proces opakujeme, pokým v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: Pri triediacom algoritme nemusíme mazať celú hromadu, stačí nám, keď v hromade ostane jeden prvok, pretože vtedy bude vstupné pole už utriedené.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right ) : \ \  \text{Vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{Heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť '''iteračnú''' aj '''rekurzívnu''' verziu, čo závisí len od toho, ako je implementovaná funkcia ''Heapify''.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia ''Heap Sort'' má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. &amp;lt;code&amp;gt;i = i - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.3. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu: &amp;lt;code&amp;gt;Heapify(pole[], j, 0)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. &amp;lt;code&amp;gt;j = j - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.4. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortIT {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void heapify(int[] pole, int n) {&lt;br /&gt;
        for (int i = 1; i &amp;lt; n; i++) {&lt;br /&gt;
&lt;br /&gt;
            /* Ak je potomok väčší ako rodič */&lt;br /&gt;
            if (pole[i] &amp;gt; pole[(i - 1) / 2]) {&lt;br /&gt;
                int j = i;&lt;br /&gt;
&lt;br /&gt;
                /* Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok */&lt;br /&gt;
                while (pole[j] &amp;gt; pole[(j - 1) / 2]) {&lt;br /&gt;
                    swap(pole, j, (j - 1) / 2);&lt;br /&gt;
                    j = (j - 1) / 2;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void sort(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n);&lt;br /&gt;
&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            int j = 0, index;&lt;br /&gt;
&lt;br /&gt;
            /* Vymeň prvý a posledný prvok */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            do {&lt;br /&gt;
                index = 2 * j + 1;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka */&lt;br /&gt;
                if (index &amp;lt; i - 1 &amp;amp;&amp;amp; pole[index] &amp;lt; pole[index + 1])&lt;br /&gt;
                    index++;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu */&lt;br /&gt;
                if (index &amp;lt; i &amp;amp;&amp;amp; pole[j] &amp;lt; pole[index])&lt;br /&gt;
                    swap(pole, j, index);&lt;br /&gt;
&lt;br /&gt;
                j = index;&lt;br /&gt;
            } while (index &amp;lt; i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortIT hs = new HeapSortIT();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortRE {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            swap(pole, i, max);&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortRE hs = new HeapSortRE();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
&lt;br /&gt;
        # Ak je potomok väčší ako rodič&lt;br /&gt;
        if pole[i] &amp;gt; pole[int((i - 1) / 2)]:&lt;br /&gt;
            j = i&lt;br /&gt;
&lt;br /&gt;
            # Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok&lt;br /&gt;
            while pole[j] &amp;gt; pole[int((j - 1) / 2)]:&lt;br /&gt;
                pole[j], pole[int((j - 1) / 2)] = pole[int((j - 1) / 2)], pole[j]       # swap&lt;br /&gt;
                j = int((j - 1) / 2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole, n):&lt;br /&gt;
    heapify(pole, n)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
&lt;br /&gt;
        # Vymeň prvý a posledný prvok&lt;br /&gt;
        pole[0], pole[i] = pole[i], pole[0]     # swap&lt;br /&gt;
&lt;br /&gt;
        j, index = 0, 0&lt;br /&gt;
&lt;br /&gt;
        while True:&lt;br /&gt;
            index = 2 * j + 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka&lt;br /&gt;
            if index &amp;lt; (i - 1) and pole[index] &amp;lt; pole[index + 1]:&lt;br /&gt;
                index += 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu&lt;br /&gt;
            if index &amp;lt; i and pole[j] &amp;lt; pole[index]:&lt;br /&gt;
                pole[j], pole[index] = pole[index], pole[j]     # swap&lt;br /&gt;
&lt;br /&gt;
            j = index&lt;br /&gt;
&lt;br /&gt;
            if index &amp;gt;= i:&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
    sort(pole, n)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n, i):&lt;br /&gt;
    max = i     # rodic&lt;br /&gt;
    l = 2 * i + 1       # lavy potomok&lt;br /&gt;
    p = 2 * i + 2       # pravy potomok&lt;br /&gt;
&lt;br /&gt;
    # Ak je ľavý potomok väčší ako rodič&lt;br /&gt;
    if l &amp;lt; n and pole[max] &amp;lt; pole[l]:&lt;br /&gt;
        max = l&lt;br /&gt;
&lt;br /&gt;
    # Ak je pravý potomok väčší ako rodič&lt;br /&gt;
    if p &amp;lt; n and pole[max] &amp;lt; pole[p]:&lt;br /&gt;
        max = p&lt;br /&gt;
&lt;br /&gt;
    # Ak sa rodič v priebehu funkcie zmenil&lt;br /&gt;
    if max != i:&lt;br /&gt;
        pole[i], pole[max] = pole[max], pole[i]     # swap&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n, max)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    # Vytvorenie hromady&lt;br /&gt;
    for i in range(n // 2 - 1, -1, -1):&lt;br /&gt;
        heapify(pole, n, i)&lt;br /&gt;
&lt;br /&gt;
    # Extrahovanie jednotlivých elementov z hromady&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
        pole[i], pole[0] = pole[0], pole[i]     # swap&lt;br /&gt;
        heapify(pole, i, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&lt;br /&gt;
    sort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
[[Súbor:SelectionSort.png|600px|náhľad|vpravo|Vizualizácia algoritmu SelectionSort]]&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Selection Sort je triediaci algoritmus, ktorý si rozdelí pole na dve časti: zotriedenú a nezotriedenú. Následne opakovane vyberá minimum v nezotriedenej časti (ak triedime vzostupne), ktoré umiestni na koniec utrienej časti.&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy kvadratická &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, čo znamená, že algoritmus je určený na triedenie veľmi malých polí (rádovo 10, 20 prvkov), vďaka minimálnej réžii a jednoduchej implementácii, avšak pre väčšie polia sa stáva veľmi neefektívny&lt;br /&gt;
* priestorová náročnosť: vždy konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie&lt;br /&gt;
&lt;br /&gt;
===Základné časti algoritmu===&lt;br /&gt;
# Vonkajší cyklus: nastavenie hornej hranice utriedenej časti.&lt;br /&gt;
# Vnútorný cyklus: hľadanie minima ....&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech má funkcia Selection Sort nasledovný prototyp: &amp;lt;code&amp;gt;SelectionSort(pole[], dlzka)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;min = pole[0]&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech &amp;lt;code&amp;gt;i = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 3.1., inak skonči.&lt;br /&gt;
:::3.1. Nech: &amp;lt;code&amp;gt;j = i&amp;lt;/code&amp;gt;&lt;br /&gt;
:::3.2. Je &amp;lt;code&amp;gt; j &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 3.2.1. , inak skoč na krok 3.3. &lt;br /&gt;
:::::3.2.1. Je &amp;lt;code&amp;gt;pole[j] &amp;lt; min&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::3.2.1.1. &amp;lt;code&amp;gt;min = pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::::3.2.1.2. Skoč na krok 3.2.&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::3.2.1.1. Skoč na krok 3.2.&lt;br /&gt;
:::3.3. Vymeň: &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[min]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::3.4. Skoč na krok 3.2.&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
Heap Sort:&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;br /&gt;
&lt;br /&gt;
https://www.geeksforgeeks.org/heap-sort/&lt;br /&gt;
&lt;br /&gt;
https://www.geeksforgeeks.org/iterative-heap-sort/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=H5kAcmGOn4Q&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13227</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13227"/>
		<updated>2021-04-19T15:45:40Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Algoritmus Heapify */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
''Heap Sort'' je triediaci algoritmus, ktorý podobne ako ''Selection sort'', rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus ''Heap Sort'', musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (''koreň'') je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (''uzol''), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (''uzol'') v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (vlastnosť ''MAX HEAP'' - ak triedime pole vzostupne, v opačnom prípade by sme použili ''MIN HEAP'').&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|Vizualizácia algoritmu Heapify: Index i je iteračná premenná (pozri pseudokód). Ľavý a pravý potomok i-teho prvku je označený ako ĽP a PP. Prvky zafarbené na modro vyjadrujú pravú podhromadu i-teho prvku a prvky zafarbené na zeleno vyjadrujú ľavú podhromadu i-teho prvku. Chronlogický postup algoritmu je znázornený číslicami 1 až 3.|699px|náhľad|vpravo]]&lt;br /&gt;
''Heapify'' je kľúčovým podprogramom triediaceho algoritmu ''Heap Sort'', vďaka ktorému vieme efektíve zabezpečiť procedúry: vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu ''Heapify'' spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady preusporiadame do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* '''dátová štruktúra:''' hromada (reprezentovaná ako: pole)&lt;br /&gt;
* '''časová zložitosť:''' lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* '''priestorová zložitosť:''' konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka i-teho prvku s maximálnou hodnotou.&lt;br /&gt;
# Porovnanie hodnoty maximálneho potomka s hodnotou rodiča (i-tym prvkom).&lt;br /&gt;
# Ak je hodnota maximálneho potomka väčšia ako hodnota rodiča, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastane výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme ''pole'' a index ''i'', v ktorom chceme vytvoriť hromadu (''Max Heap''). Musí byť splnená podmienka, že oba potomkovia i-teho prvku tvoria dve samostatné podhromady.&lt;br /&gt;
Najskôr skontrolujeme, či ''prvok'' na indexe ''i'' má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože ''i'' predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň aj jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe ''i''). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť '''iteračnú''' aj '''rekurzívnu''' verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;max = i&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je &amp;lt;code&amp;gt;lavy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[lavy] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::4.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::4.1. Pokračuj krokom 5. &lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::5.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::5.1. Pokračuj krokom 6. &lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 6.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 6.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 6.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a postupné mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|Vizualizácia priebehu algoritmu Heap Sort: Algoritus je znázornený pomocou poľa, ktoré triedime a binárnej hromady, ktorú dané pole reprezentuje. Indexy i a j sú sú iteračné premenné (pozri pseudokód). Indexy ľavého a pravého potomka i-teho prvku sú označené ako ĽP a PP. Vrchol celej hromady je označený ako V. Prvky zafarbené na modro vyjadrujú pravú podhromadu i-teho prvku a prvky zafarbené na zeleno vyjadrujú ľavú pohromadu i-teho prvku. Nevyfarbené prvky vyjadrujú prvky, ktoré boli zmazané. Chronologický priebeh je označený číslicami 1 až 12. |500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Vytvorenie binárnej hromady z poľa.&lt;br /&gt;
# Zmazanie binárnej hromady.&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus Heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. &lt;br /&gt;
&lt;br /&gt;
Najskôr si určíme rodiča posledného potomka. Využijeme rovnicu (3) z časti prehľad, ktorú si jemne upravíme:&lt;br /&gt;
 &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič:} \ \  i = \left \lfloor \frac{\text{posledný index } - \ 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - \ 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom na indexe i. Potom postupne zmenšujeme index i o 1 a opakovane naňho voláme Heapify až do chvíle, kým neprídeme na začiatok poľa. Touto procedúrou preusporiadavame spodné jednoprvkové podhromady do 3-prvkových pohromád, tie do 7-prvkových podhromád ... až kým nedostaneme jednu N-prvkovú hromadu, kde N je počet prvkov v poli. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{Heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na konci poľa považujeme už za zmazaný, preto veľkosť hromady znížime o 1. Ďalej, aby sme splnili podmienky pre maximálnu binárnu hromadu, zavoláme funkciu Heapify na celú hromadu (vrch hromady je 0-tý prvok v poli). Tento proces opakujeme, pokiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: Pri triediacom algoritme nemusíme mazať celú hromadu, stačí nám, keď v hromade ostane jeden prvok, pretože vtedy bude vstupné pole už utriedené.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right ) : \ \  \text{Vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{Heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť rekurzívnu aj iteračnú verziu, čo závisí len od toho, ako je implementovaná funkcia Heapify.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. &amp;lt;code&amp;gt;i = i - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.3. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu: &amp;lt;code&amp;gt;Heapify(pole[], j, 0)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. &amp;lt;code&amp;gt;j = j - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.4. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortIT {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void heapify(int[] pole, int n) {&lt;br /&gt;
        for (int i = 1; i &amp;lt; n; i++) {&lt;br /&gt;
&lt;br /&gt;
            /* Ak je potomok väčší ako rodič */&lt;br /&gt;
            if (pole[i] &amp;gt; pole[(i - 1) / 2]) {&lt;br /&gt;
                int j = i;&lt;br /&gt;
&lt;br /&gt;
                /* Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok */&lt;br /&gt;
                while (pole[j] &amp;gt; pole[(j - 1) / 2]) {&lt;br /&gt;
                    swap(pole, j, (j - 1) / 2);&lt;br /&gt;
                    j = (j - 1) / 2;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void sort(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n);&lt;br /&gt;
&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            int j = 0, index;&lt;br /&gt;
&lt;br /&gt;
            /* Vymeň prvý a posledný prvok */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            do {&lt;br /&gt;
                index = 2 * j + 1;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka */&lt;br /&gt;
                if (index &amp;lt; i - 1 &amp;amp;&amp;amp; pole[index] &amp;lt; pole[index + 1])&lt;br /&gt;
                    index++;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu */&lt;br /&gt;
                if (index &amp;lt; i &amp;amp;&amp;amp; pole[j] &amp;lt; pole[index])&lt;br /&gt;
                    swap(pole, j, index);&lt;br /&gt;
&lt;br /&gt;
                j = index;&lt;br /&gt;
            } while (index &amp;lt; i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortIT hs = new HeapSortIT();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortRE {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            swap(pole, i, max);&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortRE hs = new HeapSortRE();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
&lt;br /&gt;
        # Ak je potomok väčší ako rodič&lt;br /&gt;
        if pole[i] &amp;gt; pole[int((i - 1) / 2)]:&lt;br /&gt;
            j = i&lt;br /&gt;
&lt;br /&gt;
            # Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok&lt;br /&gt;
            while pole[j] &amp;gt; pole[int((j - 1) / 2)]:&lt;br /&gt;
                pole[j], pole[int((j - 1) / 2)] = pole[int((j - 1) / 2)], pole[j]       # swap&lt;br /&gt;
                j = int((j - 1) / 2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole, n):&lt;br /&gt;
    heapify(pole, n)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
&lt;br /&gt;
        # Vymeň prvý a posledný prvok&lt;br /&gt;
        pole[0], pole[i] = pole[i], pole[0]     # swap&lt;br /&gt;
&lt;br /&gt;
        j, index = 0, 0&lt;br /&gt;
&lt;br /&gt;
        while True:&lt;br /&gt;
            index = 2 * j + 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka&lt;br /&gt;
            if index &amp;lt; (i - 1) and pole[index] &amp;lt; pole[index + 1]:&lt;br /&gt;
                index += 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu&lt;br /&gt;
            if index &amp;lt; i and pole[j] &amp;lt; pole[index]:&lt;br /&gt;
                pole[j], pole[index] = pole[index], pole[j]     # swap&lt;br /&gt;
&lt;br /&gt;
            j = index&lt;br /&gt;
&lt;br /&gt;
            if index &amp;gt;= i:&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
    sort(pole, n)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n, i):&lt;br /&gt;
    max = i     # rodic&lt;br /&gt;
    l = 2 * i + 1       # lavy potomok&lt;br /&gt;
    p = 2 * i + 2       # pravy potomok&lt;br /&gt;
&lt;br /&gt;
    # Ak je ľavý potomok väčší ako rodič&lt;br /&gt;
    if l &amp;lt; n and pole[max] &amp;lt; pole[l]:&lt;br /&gt;
        max = l&lt;br /&gt;
&lt;br /&gt;
    # Ak je pravý potomok väčší ako rodič&lt;br /&gt;
    if p &amp;lt; n and pole[max] &amp;lt; pole[p]:&lt;br /&gt;
        max = p&lt;br /&gt;
&lt;br /&gt;
    # Ak sa rodič v priebehu funkcie zmenil&lt;br /&gt;
    if max != i:&lt;br /&gt;
        pole[i], pole[max] = pole[max], pole[i]     # swap&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n, max)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    # Vytvorenie hromady&lt;br /&gt;
    for i in range(n // 2 - 1, -1, -1):&lt;br /&gt;
        heapify(pole, n, i)&lt;br /&gt;
&lt;br /&gt;
    # Extrahovanie jednotlivých elementov z hromady&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
        pole[i], pole[0] = pole[0], pole[i]     # swap&lt;br /&gt;
        heapify(pole, i, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&lt;br /&gt;
    sort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
[[Súbor:SelectionSort.png|600px|náhľad|vpravo|Vizualizácia algoritmu SelectionSort]]&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Selection Sort je triediaci algoritmus, ktorý si rozdelí pole na dve časti: zotriedenú a nezotriedenú. Následne opakovane vyberá minimum v nezotriedenej časti (ak triedime vzostupne), ktoré umiestni na koniec utrienej časti.&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy kvadratická &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, čo znamená, že algoritmus je určený na triedenie veľmi malých polí (rádovo 10, 20 prvkov), vďaka minimálnej réžii a jednoduchej implementácii, avšak pre väčšie polia sa stáva veľmi neefektívny&lt;br /&gt;
* priestorová náročnosť: vždy konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie&lt;br /&gt;
&lt;br /&gt;
===Základné časti algoritmu===&lt;br /&gt;
# Vonkajší cyklus: nastavenie hornej hranice utriedenej časti.&lt;br /&gt;
# Vnútorný cyklus: hľadanie minima ....&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech má funkcia Selection Sort nasledovný prototyp: &amp;lt;code&amp;gt;SelectionSort(pole[], dlzka)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;min = pole[0]&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech &amp;lt;code&amp;gt;i = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 3.1., inak skonči.&lt;br /&gt;
:::3.1. Nech: &amp;lt;code&amp;gt;j = i&amp;lt;/code&amp;gt;&lt;br /&gt;
:::3.2. Je &amp;lt;code&amp;gt; j &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 3.2.1. , inak skoč na krok 3.3. &lt;br /&gt;
:::::3.2.1. Je &amp;lt;code&amp;gt;pole[j] &amp;lt; min&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::3.2.1.1. &amp;lt;code&amp;gt;min = pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::::3.2.1.2. Skoč na krok 3.2.&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::3.2.1.1. Skoč na krok 3.2.&lt;br /&gt;
:::3.3. Vymeň: &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[min]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::3.4. Skoč na krok 3.2.&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
Heap Sort:&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;br /&gt;
&lt;br /&gt;
https://www.geeksforgeeks.org/heap-sort/&lt;br /&gt;
&lt;br /&gt;
https://www.geeksforgeeks.org/iterative-heap-sort/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=H5kAcmGOn4Q&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13224</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13224"/>
		<updated>2021-04-19T15:41:35Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Prehľad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
''Heap Sort'' je triediaci algoritmus, ktorý podobne ako ''Selection sort'', rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus ''Heap Sort'', musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (''koreň'') je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (''uzol''), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (''uzol'') v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (vlastnosť ''MAX HEAP'' - ak triedime pole vzostupne, v opačnom prípade by sme použili ''MIN HEAP'').&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|Vizualizácia algoritmu Heapify: Index i je iteračná premenná (pozri pseudokód). Ľavý a pravý potomok i-teho prvku je označený ako ĽP a PP. Prvky zafarbené na modro vyjadrujú pravú podhromadu i-teho prvku a prvky zafarbené na zeleno vyjadrujú ľavú podhromadu i-teho prvku. Chronlogický postup algoritmu je znázornený číslicami 1 až 3.|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť procedúry: vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu Heapify spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady preusporiadame do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka i-teho prvku s maximálnou hodnotou.&lt;br /&gt;
# Porovnanie hodnoty maximálneho potomka s hodnotou rodiča (i-tym prvkom).&lt;br /&gt;
# Ak je hodnota maximálneho potomka väčšia ako hodnota rodiča, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastane výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme pole a index i, v ktorom chceme vytvoriť hromadu (Max Heap). Musí byť splnená podmienka, že oba potomkovia i-teho prvku tvoria dve samostatné podhromady.&lt;br /&gt;
Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň aj jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;max = i&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je &amp;lt;code&amp;gt;lavy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[lavy] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::4.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::4.1. Pokračuj krokom 5. &lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::5.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::5.1. Pokračuj krokom 6. &lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 6.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 6.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 6.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a postupné mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|Vizualizácia priebehu algoritmu Heap Sort: Algoritus je znázornený pomocou poľa, ktoré triedime a binárnej hromady, ktorú dané pole reprezentuje. Indexy i a j sú sú iteračné premenné (pozri pseudokód). Indexy ľavého a pravého potomka i-teho prvku sú označené ako ĽP a PP. Vrchol celej hromady je označený ako V. Prvky zafarbené na modro vyjadrujú pravú podhromadu i-teho prvku a prvky zafarbené na zeleno vyjadrujú ľavú pohromadu i-teho prvku. Nevyfarbené prvky vyjadrujú prvky, ktoré boli zmazané. Chronologický priebeh je označený číslicami 1 až 12. |500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Vytvorenie binárnej hromady z poľa.&lt;br /&gt;
# Zmazanie binárnej hromady.&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus Heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. &lt;br /&gt;
&lt;br /&gt;
Najskôr si určíme rodiča posledného potomka. Využijeme rovnicu (3) z časti prehľad, ktorú si jemne upravíme:&lt;br /&gt;
 &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič:} \ \  i = \left \lfloor \frac{\text{posledný index } - \ 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - \ 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom na indexe i. Potom postupne zmenšujeme index i o 1 a opakovane naňho voláme Heapify až do chvíle, kým neprídeme na začiatok poľa. Touto procedúrou preusporiadavame spodné jednoprvkové podhromady do 3-prvkových pohromád, tie do 7-prvkových podhromád ... až kým nedostaneme jednu N-prvkovú hromadu, kde N je počet prvkov v poli. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{Heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na konci poľa považujeme už za zmazaný, preto veľkosť hromady znížime o 1. Ďalej, aby sme splnili podmienky pre maximálnu binárnu hromadu, zavoláme funkciu Heapify na celú hromadu (vrch hromady je 0-tý prvok v poli). Tento proces opakujeme, pokiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: Pri triediacom algoritme nemusíme mazať celú hromadu, stačí nám, keď v hromade ostane jeden prvok, pretože vtedy bude vstupné pole už utriedené.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right ) : \ \  \text{Vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{Heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť rekurzívnu aj iteračnú verziu, čo závisí len od toho, ako je implementovaná funkcia Heapify.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. &amp;lt;code&amp;gt;i = i - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.3. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. &amp;lt;code&amp;gt;j = j - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.4. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortIT {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void heapify(int[] pole, int n) {&lt;br /&gt;
        for (int i = 1; i &amp;lt; n; i++) {&lt;br /&gt;
&lt;br /&gt;
            /* Ak je potomok väčší ako rodič */&lt;br /&gt;
            if (pole[i] &amp;gt; pole[(i - 1) / 2]) {&lt;br /&gt;
                int j = i;&lt;br /&gt;
&lt;br /&gt;
                /* Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok */&lt;br /&gt;
                while (pole[j] &amp;gt; pole[(j - 1) / 2]) {&lt;br /&gt;
                    swap(pole, j, (j - 1) / 2);&lt;br /&gt;
                    j = (j - 1) / 2;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void sort(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n);&lt;br /&gt;
&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            int j = 0, index;&lt;br /&gt;
&lt;br /&gt;
            /* Vymeň prvý a posledný prvok */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            do {&lt;br /&gt;
                index = 2 * j + 1;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka */&lt;br /&gt;
                if (index &amp;lt; i - 1 &amp;amp;&amp;amp; pole[index] &amp;lt; pole[index + 1])&lt;br /&gt;
                    index++;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu */&lt;br /&gt;
                if (index &amp;lt; i &amp;amp;&amp;amp; pole[j] &amp;lt; pole[index])&lt;br /&gt;
                    swap(pole, j, index);&lt;br /&gt;
&lt;br /&gt;
                j = index;&lt;br /&gt;
            } while (index &amp;lt; i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortIT hs = new HeapSortIT();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortRE {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            swap(pole, i, max);&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortRE hs = new HeapSortRE();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
&lt;br /&gt;
        # Ak je potomok väčší ako rodič&lt;br /&gt;
        if pole[i] &amp;gt; pole[int((i - 1) / 2)]:&lt;br /&gt;
            j = i&lt;br /&gt;
&lt;br /&gt;
            # Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok&lt;br /&gt;
            while pole[j] &amp;gt; pole[int((j - 1) / 2)]:&lt;br /&gt;
                pole[j], pole[int((j - 1) / 2)] = pole[int((j - 1) / 2)], pole[j]       # swap&lt;br /&gt;
                j = int((j - 1) / 2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole, n):&lt;br /&gt;
    heapify(pole, n)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
&lt;br /&gt;
        # Vymeň prvý a posledný prvok&lt;br /&gt;
        pole[0], pole[i] = pole[i], pole[0]     # swap&lt;br /&gt;
&lt;br /&gt;
        j, index = 0, 0&lt;br /&gt;
&lt;br /&gt;
        while True:&lt;br /&gt;
            index = 2 * j + 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka&lt;br /&gt;
            if index &amp;lt; (i - 1) and pole[index] &amp;lt; pole[index + 1]:&lt;br /&gt;
                index += 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu&lt;br /&gt;
            if index &amp;lt; i and pole[j] &amp;lt; pole[index]:&lt;br /&gt;
                pole[j], pole[index] = pole[index], pole[j]     # swap&lt;br /&gt;
&lt;br /&gt;
            j = index&lt;br /&gt;
&lt;br /&gt;
            if index &amp;gt;= i:&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
    sort(pole, n)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n, i):&lt;br /&gt;
    max = i     # rodic&lt;br /&gt;
    l = 2 * i + 1       # lavy potomok&lt;br /&gt;
    p = 2 * i + 2       # pravy potomok&lt;br /&gt;
&lt;br /&gt;
    # Ak je ľavý potomok väčší ako rodič&lt;br /&gt;
    if l &amp;lt; n and pole[max] &amp;lt; pole[l]:&lt;br /&gt;
        max = l&lt;br /&gt;
&lt;br /&gt;
    # Ak je pravý potomok väčší ako rodič&lt;br /&gt;
    if p &amp;lt; n and pole[max] &amp;lt; pole[p]:&lt;br /&gt;
        max = p&lt;br /&gt;
&lt;br /&gt;
    # Ak sa rodič v priebehu funkcie zmenil&lt;br /&gt;
    if max != i:&lt;br /&gt;
        pole[i], pole[max] = pole[max], pole[i]     # swap&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n, max)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    # Vytvorenie hromady&lt;br /&gt;
    for i in range(n // 2 - 1, -1, -1):&lt;br /&gt;
        heapify(pole, n, i)&lt;br /&gt;
&lt;br /&gt;
    # Extrahovanie jednotlivých elementov z hromady&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
        pole[i], pole[0] = pole[0], pole[i]     # swap&lt;br /&gt;
        heapify(pole, i, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&lt;br /&gt;
    sort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
[[Súbor:SelectionSort.png|600px|náhľad|vpravo|Vizualizácia algoritmu SelectionSort]]&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Selection Sort je triediaci algoritmus, ktorý si rozdelí pole na dve časti: zotriedenú a nezotriedenú. Následne opakovane vyberá minimum v nezotriedenej časti (ak triedime vzostupne), ktoré umiestni na koniec utrienej časti.&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy kvadratická &amp;lt;math&amp;gt; O(n^2) &amp;lt;/math&amp;gt;, čo znamená, že algoritmus je určený na triedenie veľmi malých polí (rádovo 10, 20 prvkov), vďaka minimálnej réžii a jednoduchej implementácii, avšak pre väčšie polia sa stáva veľmi neefektívny&lt;br /&gt;
* priestorová náročnosť: vždy konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie&lt;br /&gt;
&lt;br /&gt;
===Základné časti algoritmu===&lt;br /&gt;
# Vonkajší cyklus: nastavenie hornej hranice utriedenej časti.&lt;br /&gt;
# Vnútorný cyklus: hľadanie minima ....&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech má funkcia Selection Sort nasledovný prototyp: &amp;lt;code&amp;gt;SelectionSort(pole[], dlzka)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;min = pole[0]&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech &amp;lt;code&amp;gt;i = 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 3.1., inak skonči.&lt;br /&gt;
:::3.1. Nech: &amp;lt;code&amp;gt;j = i&amp;lt;/code&amp;gt;&lt;br /&gt;
:::3.2. Je &amp;lt;code&amp;gt; j &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 3.2.1. , inak skoč na krok 3.3. &lt;br /&gt;
:::::3.2.1. Je &amp;lt;code&amp;gt;pole[j] &amp;lt; min&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::3.2.1.1. &amp;lt;code&amp;gt;min = pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::::3.2.1.2. Skoč na krok 3.2.&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::3.2.1.1. Skoč na krok 3.2.&lt;br /&gt;
:::3.3. Vymeň: &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[min]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::3.4. Skoč na krok 3.2.&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
Heap Sort:&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;br /&gt;
&lt;br /&gt;
https://www.geeksforgeeks.org/heap-sort/&lt;br /&gt;
&lt;br /&gt;
https://www.geeksforgeeks.org/iterative-heap-sort/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=H5kAcmGOn4Q&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13183</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13183"/>
		<updated>2021-04-11T10:00:31Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý podobne ako Selection sort rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním  a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu Heapify spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady zlúčime do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme pole a index i, v ktorom chceme vytvoriť hromadu (Max Heap). Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak  porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortIT {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void heapify(int[] pole, int n) {&lt;br /&gt;
        for (int i = 1; i &amp;lt; n; i++) {&lt;br /&gt;
&lt;br /&gt;
            /* Ak je potomok väčší ako rodič */&lt;br /&gt;
            if (pole[i] &amp;gt; pole[(i - 1) / 2]) {&lt;br /&gt;
                int j = i;&lt;br /&gt;
&lt;br /&gt;
                /* Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok */&lt;br /&gt;
                while (pole[j] &amp;gt; pole[(j - 1) / 2]) {&lt;br /&gt;
                    swap(pole, j, (j - 1) / 2);&lt;br /&gt;
                    j = (j - 1) / 2;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void sort(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n);&lt;br /&gt;
&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            int j = 0, index;&lt;br /&gt;
&lt;br /&gt;
            /* Vymeň prvý a posledný prvok */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            do {&lt;br /&gt;
                index = 2 * j + 1;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka */&lt;br /&gt;
                if (index &amp;lt; i - 1 &amp;amp;&amp;amp; pole[index] &amp;lt; pole[index + 1])&lt;br /&gt;
                    index++;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu */&lt;br /&gt;
                if (index &amp;lt; i &amp;amp;&amp;amp; pole[j] &amp;lt; pole[index])&lt;br /&gt;
                    swap(pole, j, index);&lt;br /&gt;
&lt;br /&gt;
                j = index;&lt;br /&gt;
            } while (index &amp;lt; i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortIT hs = new HeapSortIT();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortRE {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            swap(pole, i, max);&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortRE hs = new HeapSortRE();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
&lt;br /&gt;
        # Ak je potomok väčší ako rodič&lt;br /&gt;
        if pole[i] &amp;gt; pole[int((i - 1) / 2)]:&lt;br /&gt;
            j = i&lt;br /&gt;
&lt;br /&gt;
            # Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok&lt;br /&gt;
            while pole[j] &amp;gt; pole[int((j - 1) / 2)]:&lt;br /&gt;
                pole[j], pole[int((j - 1) / 2)] = pole[int((j - 1) / 2)], pole[j]       # swap&lt;br /&gt;
                j = int((j - 1) / 2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole, n):&lt;br /&gt;
    heapify(pole, n)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
&lt;br /&gt;
        # Vymeň prvý a posledný prvok&lt;br /&gt;
        pole[0], pole[i] = pole[i], pole[0]     # swap&lt;br /&gt;
&lt;br /&gt;
        j, index = 0, 0&lt;br /&gt;
&lt;br /&gt;
        while True:&lt;br /&gt;
            index = 2 * j + 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka&lt;br /&gt;
            if index &amp;lt; (i - 1) and pole[index] &amp;lt; pole[index + 1]:&lt;br /&gt;
                index += 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu&lt;br /&gt;
            if index &amp;lt; i and pole[j] &amp;lt; pole[index]:&lt;br /&gt;
                pole[j], pole[index] = pole[index], pole[j]     # swap&lt;br /&gt;
&lt;br /&gt;
            j = index&lt;br /&gt;
&lt;br /&gt;
            if index &amp;gt;= i:&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
    sort(pole, n)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n, i):&lt;br /&gt;
    max = i     # rodic&lt;br /&gt;
    l = 2 * i + 1       # lavy potomok&lt;br /&gt;
    p = 2 * i + 2       # pravy potomok&lt;br /&gt;
&lt;br /&gt;
    # Ak je ľavý potomok väčší ako rodič&lt;br /&gt;
    if l &amp;lt; n and pole[max] &amp;lt; pole[l]:&lt;br /&gt;
        max = l&lt;br /&gt;
&lt;br /&gt;
    # Ak je pravý potomok väčší ako rodič&lt;br /&gt;
    if p &amp;lt; n and pole[max] &amp;lt; pole[p]:&lt;br /&gt;
        max = p&lt;br /&gt;
&lt;br /&gt;
    # Ak sa rodič v priebehu funkcie zmenil&lt;br /&gt;
    if max != i:&lt;br /&gt;
        pole[i], pole[max] = pole[max], pole[i]     # swap&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n, max)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    # Vytvorenie hromady&lt;br /&gt;
    for i in range(n // 2 - 1, -1, -1):&lt;br /&gt;
        heapify(pole, n, i)&lt;br /&gt;
&lt;br /&gt;
    # Extrahovanie jednotlivých elementov z hromady&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
        pole[i], pole[0] = pole[0], pole[i]     # swap&lt;br /&gt;
        heapify(pole, i, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&lt;br /&gt;
    sort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
Heap Sort:&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;br /&gt;
&lt;br /&gt;
https://www.geeksforgeeks.org/heap-sort/&lt;br /&gt;
&lt;br /&gt;
https://www.geeksforgeeks.org/iterative-heap-sort/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=H5kAcmGOn4Q&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13182</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13182"/>
		<updated>2021-04-11T10:00:06Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Odkazy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Tento článok je v prvotnom štádiu konštrukcie, zatiaľ je to len hromada myšlienok :)==&lt;br /&gt;
odtiaľto sa odrazíme: https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý podobne ako Selection sort rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním  a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu Heapify spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady zlúčime do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme pole a index i, v ktorom chceme vytvoriť hromadu (Max Heap). Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak  porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortIT {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void heapify(int[] pole, int n) {&lt;br /&gt;
        for (int i = 1; i &amp;lt; n; i++) {&lt;br /&gt;
&lt;br /&gt;
            /* Ak je potomok väčší ako rodič */&lt;br /&gt;
            if (pole[i] &amp;gt; pole[(i - 1) / 2]) {&lt;br /&gt;
                int j = i;&lt;br /&gt;
&lt;br /&gt;
                /* Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok */&lt;br /&gt;
                while (pole[j] &amp;gt; pole[(j - 1) / 2]) {&lt;br /&gt;
                    swap(pole, j, (j - 1) / 2);&lt;br /&gt;
                    j = (j - 1) / 2;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void sort(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n);&lt;br /&gt;
&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            int j = 0, index;&lt;br /&gt;
&lt;br /&gt;
            /* Vymeň prvý a posledný prvok */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            do {&lt;br /&gt;
                index = 2 * j + 1;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka */&lt;br /&gt;
                if (index &amp;lt; i - 1 &amp;amp;&amp;amp; pole[index] &amp;lt; pole[index + 1])&lt;br /&gt;
                    index++;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu */&lt;br /&gt;
                if (index &amp;lt; i &amp;amp;&amp;amp; pole[j] &amp;lt; pole[index])&lt;br /&gt;
                    swap(pole, j, index);&lt;br /&gt;
&lt;br /&gt;
                j = index;&lt;br /&gt;
            } while (index &amp;lt; i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortIT hs = new HeapSortIT();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortRE {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            swap(pole, i, max);&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortRE hs = new HeapSortRE();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
&lt;br /&gt;
        # Ak je potomok väčší ako rodič&lt;br /&gt;
        if pole[i] &amp;gt; pole[int((i - 1) / 2)]:&lt;br /&gt;
            j = i&lt;br /&gt;
&lt;br /&gt;
            # Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok&lt;br /&gt;
            while pole[j] &amp;gt; pole[int((j - 1) / 2)]:&lt;br /&gt;
                pole[j], pole[int((j - 1) / 2)] = pole[int((j - 1) / 2)], pole[j]       # swap&lt;br /&gt;
                j = int((j - 1) / 2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole, n):&lt;br /&gt;
    heapify(pole, n)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
&lt;br /&gt;
        # Vymeň prvý a posledný prvok&lt;br /&gt;
        pole[0], pole[i] = pole[i], pole[0]     # swap&lt;br /&gt;
&lt;br /&gt;
        j, index = 0, 0&lt;br /&gt;
&lt;br /&gt;
        while True:&lt;br /&gt;
            index = 2 * j + 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka&lt;br /&gt;
            if index &amp;lt; (i - 1) and pole[index] &amp;lt; pole[index + 1]:&lt;br /&gt;
                index += 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu&lt;br /&gt;
            if index &amp;lt; i and pole[j] &amp;lt; pole[index]:&lt;br /&gt;
                pole[j], pole[index] = pole[index], pole[j]     # swap&lt;br /&gt;
&lt;br /&gt;
            j = index&lt;br /&gt;
&lt;br /&gt;
            if index &amp;gt;= i:&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
    sort(pole, n)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n, i):&lt;br /&gt;
    max = i     # rodic&lt;br /&gt;
    l = 2 * i + 1       # lavy potomok&lt;br /&gt;
    p = 2 * i + 2       # pravy potomok&lt;br /&gt;
&lt;br /&gt;
    # Ak je ľavý potomok väčší ako rodič&lt;br /&gt;
    if l &amp;lt; n and pole[max] &amp;lt; pole[l]:&lt;br /&gt;
        max = l&lt;br /&gt;
&lt;br /&gt;
    # Ak je pravý potomok väčší ako rodič&lt;br /&gt;
    if p &amp;lt; n and pole[max] &amp;lt; pole[p]:&lt;br /&gt;
        max = p&lt;br /&gt;
&lt;br /&gt;
    # Ak sa rodič v priebehu funkcie zmenil&lt;br /&gt;
    if max != i:&lt;br /&gt;
        pole[i], pole[max] = pole[max], pole[i]     # swap&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n, max)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    # Vytvorenie hromady&lt;br /&gt;
    for i in range(n // 2 - 1, -1, -1):&lt;br /&gt;
        heapify(pole, n, i)&lt;br /&gt;
&lt;br /&gt;
    # Extrahovanie jednotlivých elementov z hromady&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
        pole[i], pole[0] = pole[0], pole[i]     # swap&lt;br /&gt;
        heapify(pole, i, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&lt;br /&gt;
    sort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
Heap Sort:&lt;br /&gt;
&lt;br /&gt;
https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;br /&gt;
&lt;br /&gt;
https://www.geeksforgeeks.org/heap-sort/&lt;br /&gt;
&lt;br /&gt;
https://www.geeksforgeeks.org/iterative-heap-sort/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=H5kAcmGOn4Q&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13181</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13181"/>
		<updated>2021-04-11T09:59:04Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Odkazy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Tento článok je v prvotnom štádiu konštrukcie, zatiaľ je to len hromada myšlienok :)==&lt;br /&gt;
odtiaľto sa odrazíme: https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý podobne ako Selection sort rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním  a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu Heapify spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady zlúčime do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme pole a index i, v ktorom chceme vytvoriť hromadu (Max Heap). Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak  porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortIT {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void heapify(int[] pole, int n) {&lt;br /&gt;
        for (int i = 1; i &amp;lt; n; i++) {&lt;br /&gt;
&lt;br /&gt;
            /* Ak je potomok väčší ako rodič */&lt;br /&gt;
            if (pole[i] &amp;gt; pole[(i - 1) / 2]) {&lt;br /&gt;
                int j = i;&lt;br /&gt;
&lt;br /&gt;
                /* Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok */&lt;br /&gt;
                while (pole[j] &amp;gt; pole[(j - 1) / 2]) {&lt;br /&gt;
                    swap(pole, j, (j - 1) / 2);&lt;br /&gt;
                    j = (j - 1) / 2;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void sort(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n);&lt;br /&gt;
&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            int j = 0, index;&lt;br /&gt;
&lt;br /&gt;
            /* Vymeň prvý a posledný prvok */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            do {&lt;br /&gt;
                index = 2 * j + 1;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka */&lt;br /&gt;
                if (index &amp;lt; i - 1 &amp;amp;&amp;amp; pole[index] &amp;lt; pole[index + 1])&lt;br /&gt;
                    index++;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu */&lt;br /&gt;
                if (index &amp;lt; i &amp;amp;&amp;amp; pole[j] &amp;lt; pole[index])&lt;br /&gt;
                    swap(pole, j, index);&lt;br /&gt;
&lt;br /&gt;
                j = index;&lt;br /&gt;
            } while (index &amp;lt; i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortIT hs = new HeapSortIT();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortRE {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            swap(pole, i, max);&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortRE hs = new HeapSortRE();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
&lt;br /&gt;
        # Ak je potomok väčší ako rodič&lt;br /&gt;
        if pole[i] &amp;gt; pole[int((i - 1) / 2)]:&lt;br /&gt;
            j = i&lt;br /&gt;
&lt;br /&gt;
            # Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok&lt;br /&gt;
            while pole[j] &amp;gt; pole[int((j - 1) / 2)]:&lt;br /&gt;
                pole[j], pole[int((j - 1) / 2)] = pole[int((j - 1) / 2)], pole[j]       # swap&lt;br /&gt;
                j = int((j - 1) / 2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole, n):&lt;br /&gt;
    heapify(pole, n)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
&lt;br /&gt;
        # Vymeň prvý a posledný prvok&lt;br /&gt;
        pole[0], pole[i] = pole[i], pole[0]     # swap&lt;br /&gt;
&lt;br /&gt;
        j, index = 0, 0&lt;br /&gt;
&lt;br /&gt;
        while True:&lt;br /&gt;
            index = 2 * j + 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka&lt;br /&gt;
            if index &amp;lt; (i - 1) and pole[index] &amp;lt; pole[index + 1]:&lt;br /&gt;
                index += 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu&lt;br /&gt;
            if index &amp;lt; i and pole[j] &amp;lt; pole[index]:&lt;br /&gt;
                pole[j], pole[index] = pole[index], pole[j]     # swap&lt;br /&gt;
&lt;br /&gt;
            j = index&lt;br /&gt;
&lt;br /&gt;
            if index &amp;gt;= i:&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
    sort(pole, n)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n, i):&lt;br /&gt;
    max = i     # rodic&lt;br /&gt;
    l = 2 * i + 1       # lavy potomok&lt;br /&gt;
    p = 2 * i + 2       # pravy potomok&lt;br /&gt;
&lt;br /&gt;
    # Ak je ľavý potomok väčší ako rodič&lt;br /&gt;
    if l &amp;lt; n and pole[max] &amp;lt; pole[l]:&lt;br /&gt;
        max = l&lt;br /&gt;
&lt;br /&gt;
    # Ak je pravý potomok väčší ako rodič&lt;br /&gt;
    if p &amp;lt; n and pole[max] &amp;lt; pole[p]:&lt;br /&gt;
        max = p&lt;br /&gt;
&lt;br /&gt;
    # Ak sa rodič v priebehu funkcie zmenil&lt;br /&gt;
    if max != i:&lt;br /&gt;
        pole[i], pole[max] = pole[max], pole[i]     # swap&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n, max)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    # Vytvorenie hromady&lt;br /&gt;
    for i in range(n // 2 - 1, -1, -1):&lt;br /&gt;
        heapify(pole, n, i)&lt;br /&gt;
&lt;br /&gt;
    # Extrahovanie jednotlivých elementov z hromady&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
        pole[i], pole[0] = pole[0], pole[i]     # swap&lt;br /&gt;
        heapify(pole, i, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&lt;br /&gt;
    sort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
Heap Sort:&lt;br /&gt;
&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;br /&gt;
&lt;br /&gt;
https://www.geeksforgeeks.org/heap-sort/&lt;br /&gt;
&lt;br /&gt;
https://www.geeksforgeeks.org/iterative-heap-sort/&lt;br /&gt;
&lt;br /&gt;
https://www.youtube.com/watch?v=H5kAcmGOn4Q&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13180</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13180"/>
		<updated>2021-04-11T09:58:43Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Odkazy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Tento článok je v prvotnom štádiu konštrukcie, zatiaľ je to len hromada myšlienok :)==&lt;br /&gt;
odtiaľto sa odrazíme: https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý podobne ako Selection sort rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním  a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu Heapify spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady zlúčime do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme pole a index i, v ktorom chceme vytvoriť hromadu (Max Heap). Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak  porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortIT {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void heapify(int[] pole, int n) {&lt;br /&gt;
        for (int i = 1; i &amp;lt; n; i++) {&lt;br /&gt;
&lt;br /&gt;
            /* Ak je potomok väčší ako rodič */&lt;br /&gt;
            if (pole[i] &amp;gt; pole[(i - 1) / 2]) {&lt;br /&gt;
                int j = i;&lt;br /&gt;
&lt;br /&gt;
                /* Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok */&lt;br /&gt;
                while (pole[j] &amp;gt; pole[(j - 1) / 2]) {&lt;br /&gt;
                    swap(pole, j, (j - 1) / 2);&lt;br /&gt;
                    j = (j - 1) / 2;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void sort(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n);&lt;br /&gt;
&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            int j = 0, index;&lt;br /&gt;
&lt;br /&gt;
            /* Vymeň prvý a posledný prvok */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            do {&lt;br /&gt;
                index = 2 * j + 1;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka */&lt;br /&gt;
                if (index &amp;lt; i - 1 &amp;amp;&amp;amp; pole[index] &amp;lt; pole[index + 1])&lt;br /&gt;
                    index++;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu */&lt;br /&gt;
                if (index &amp;lt; i &amp;amp;&amp;amp; pole[j] &amp;lt; pole[index])&lt;br /&gt;
                    swap(pole, j, index);&lt;br /&gt;
&lt;br /&gt;
                j = index;&lt;br /&gt;
            } while (index &amp;lt; i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortIT hs = new HeapSortIT();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortRE {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            swap(pole, i, max);&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortRE hs = new HeapSortRE();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
&lt;br /&gt;
        # Ak je potomok väčší ako rodič&lt;br /&gt;
        if pole[i] &amp;gt; pole[int((i - 1) / 2)]:&lt;br /&gt;
            j = i&lt;br /&gt;
&lt;br /&gt;
            # Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok&lt;br /&gt;
            while pole[j] &amp;gt; pole[int((j - 1) / 2)]:&lt;br /&gt;
                pole[j], pole[int((j - 1) / 2)] = pole[int((j - 1) / 2)], pole[j]       # swap&lt;br /&gt;
                j = int((j - 1) / 2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole, n):&lt;br /&gt;
    heapify(pole, n)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
&lt;br /&gt;
        # Vymeň prvý a posledný prvok&lt;br /&gt;
        pole[0], pole[i] = pole[i], pole[0]     # swap&lt;br /&gt;
&lt;br /&gt;
        j, index = 0, 0&lt;br /&gt;
&lt;br /&gt;
        while True:&lt;br /&gt;
            index = 2 * j + 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka&lt;br /&gt;
            if index &amp;lt; (i - 1) and pole[index] &amp;lt; pole[index + 1]:&lt;br /&gt;
                index += 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu&lt;br /&gt;
            if index &amp;lt; i and pole[j] &amp;lt; pole[index]:&lt;br /&gt;
                pole[j], pole[index] = pole[index], pole[j]     # swap&lt;br /&gt;
&lt;br /&gt;
            j = index&lt;br /&gt;
&lt;br /&gt;
            if index &amp;gt;= i:&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
    sort(pole, n)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n, i):&lt;br /&gt;
    max = i     # rodic&lt;br /&gt;
    l = 2 * i + 1       # lavy potomok&lt;br /&gt;
    p = 2 * i + 2       # pravy potomok&lt;br /&gt;
&lt;br /&gt;
    # Ak je ľavý potomok väčší ako rodič&lt;br /&gt;
    if l &amp;lt; n and pole[max] &amp;lt; pole[l]:&lt;br /&gt;
        max = l&lt;br /&gt;
&lt;br /&gt;
    # Ak je pravý potomok väčší ako rodič&lt;br /&gt;
    if p &amp;lt; n and pole[max] &amp;lt; pole[p]:&lt;br /&gt;
        max = p&lt;br /&gt;
&lt;br /&gt;
    # Ak sa rodič v priebehu funkcie zmenil&lt;br /&gt;
    if max != i:&lt;br /&gt;
        pole[i], pole[max] = pole[max], pole[i]     # swap&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n, max)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    # Vytvorenie hromady&lt;br /&gt;
    for i in range(n // 2 - 1, -1, -1):&lt;br /&gt;
        heapify(pole, n, i)&lt;br /&gt;
&lt;br /&gt;
    # Extrahovanie jednotlivých elementov z hromady&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
        pole[i], pole[0] = pole[0], pole[i]     # swap&lt;br /&gt;
        heapify(pole, i, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&lt;br /&gt;
    sort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
Heap Sort:&lt;br /&gt;
&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;br /&gt;
https://www.geeksforgeeks.org/heap-sort/&lt;br /&gt;
https://www.geeksforgeeks.org/iterative-heap-sort/&lt;br /&gt;
https://www.youtube.com/watch?v=H5kAcmGOn4Q&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13179</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13179"/>
		<updated>2021-04-11T09:56:43Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Tento článok je v prvotnom štádiu konštrukcie, zatiaľ je to len hromada myšlienok :)==&lt;br /&gt;
odtiaľto sa odrazíme: https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý podobne ako Selection sort rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním  a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu Heapify spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady zlúčime do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme pole a index i, v ktorom chceme vytvoriť hromadu (Max Heap). Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak  porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortIT {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void heapify(int[] pole, int n) {&lt;br /&gt;
        for (int i = 1; i &amp;lt; n; i++) {&lt;br /&gt;
&lt;br /&gt;
            /* Ak je potomok väčší ako rodič */&lt;br /&gt;
            if (pole[i] &amp;gt; pole[(i - 1) / 2]) {&lt;br /&gt;
                int j = i;&lt;br /&gt;
&lt;br /&gt;
                /* Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok */&lt;br /&gt;
                while (pole[j] &amp;gt; pole[(j - 1) / 2]) {&lt;br /&gt;
                    swap(pole, j, (j - 1) / 2);&lt;br /&gt;
                    j = (j - 1) / 2;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void sort(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n);&lt;br /&gt;
&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            int j = 0, index;&lt;br /&gt;
&lt;br /&gt;
            /* Vymeň prvý a posledný prvok */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            do {&lt;br /&gt;
                index = 2 * j + 1;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka */&lt;br /&gt;
                if (index &amp;lt; i - 1 &amp;amp;&amp;amp; pole[index] &amp;lt; pole[index + 1])&lt;br /&gt;
                    index++;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu */&lt;br /&gt;
                if (index &amp;lt; i &amp;amp;&amp;amp; pole[j] &amp;lt; pole[index])&lt;br /&gt;
                    swap(pole, j, index);&lt;br /&gt;
&lt;br /&gt;
                j = index;&lt;br /&gt;
            } while (index &amp;lt; i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortIT hs = new HeapSortIT();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortRE {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            swap(pole, i, max);&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortRE hs = new HeapSortRE();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
&lt;br /&gt;
        # Ak je potomok väčší ako rodič&lt;br /&gt;
        if pole[i] &amp;gt; pole[int((i - 1) / 2)]:&lt;br /&gt;
            j = i&lt;br /&gt;
&lt;br /&gt;
            # Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok&lt;br /&gt;
            while pole[j] &amp;gt; pole[int((j - 1) / 2)]:&lt;br /&gt;
                pole[j], pole[int((j - 1) / 2)] = pole[int((j - 1) / 2)], pole[j]       # swap&lt;br /&gt;
                j = int((j - 1) / 2)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole, n):&lt;br /&gt;
    heapify(pole, n)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
&lt;br /&gt;
        # Vymeň prvý a posledný prvok&lt;br /&gt;
        pole[0], pole[i] = pole[i], pole[0]     # swap&lt;br /&gt;
&lt;br /&gt;
        j, index = 0, 0&lt;br /&gt;
&lt;br /&gt;
        while True:&lt;br /&gt;
            index = 2 * j + 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka&lt;br /&gt;
            if index &amp;lt; (i - 1) and pole[index] &amp;lt; pole[index + 1]:&lt;br /&gt;
                index += 1&lt;br /&gt;
&lt;br /&gt;
            # Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu&lt;br /&gt;
            if index &amp;lt; i and pole[j] &amp;lt; pole[index]:&lt;br /&gt;
                pole[j], pole[index] = pole[index], pole[j]     # swap&lt;br /&gt;
&lt;br /&gt;
            j = index&lt;br /&gt;
&lt;br /&gt;
            if index &amp;gt;= i:&lt;br /&gt;
                break&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole, n):&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
    sort(pole, n)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole, n)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n, i):&lt;br /&gt;
    max = i     # rodic&lt;br /&gt;
    l = 2 * i + 1       # lavy potomok&lt;br /&gt;
    p = 2 * i + 2       # pravy potomok&lt;br /&gt;
&lt;br /&gt;
    # Ak je ľavý potomok väčší ako rodič&lt;br /&gt;
    if l &amp;lt; n and pole[max] &amp;lt; pole[l]:&lt;br /&gt;
        max = l&lt;br /&gt;
&lt;br /&gt;
    # Ak je pravý potomok väčší ako rodič&lt;br /&gt;
    if p &amp;lt; n and pole[max] &amp;lt; pole[p]:&lt;br /&gt;
        max = p&lt;br /&gt;
&lt;br /&gt;
    # Ak sa rodič v priebehu funkcie zmenil&lt;br /&gt;
    if max != i:&lt;br /&gt;
        pole[i], pole[max] = pole[max], pole[i]     # swap&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n, max)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    # Vytvorenie hromady&lt;br /&gt;
    for i in range(n // 2 - 1, -1, -1):&lt;br /&gt;
        heapify(pole, n, i)&lt;br /&gt;
&lt;br /&gt;
    # Extrahovanie jednotlivých elementov z hromady&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
        pole[i], pole[0] = pole[0], pole[i]     # swap&lt;br /&gt;
        heapify(pole, i, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&lt;br /&gt;
    sort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13178</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13178"/>
		<updated>2021-04-11T09:35:50Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Tento článok je v prvotnom štádiu konštrukcie, zatiaľ je to len hromada myšlienok :)==&lt;br /&gt;
odtiaľto sa odrazíme: https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý podobne ako Selection sort rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním  a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu Heapify spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady zlúčime do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme pole a index i, v ktorom chceme vytvoriť hromadu (Max Heap). Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak  porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortIT {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void heapify(int[] pole, int n) {&lt;br /&gt;
        for (int i = 1; i &amp;lt; n; i++) {&lt;br /&gt;
&lt;br /&gt;
            /* Ak je potomok väčší ako rodič */&lt;br /&gt;
            if (pole[i] &amp;gt; pole[(i - 1) / 2]) {&lt;br /&gt;
                int j = i;&lt;br /&gt;
&lt;br /&gt;
                /* Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok */&lt;br /&gt;
                while (pole[j] &amp;gt; pole[(j - 1) / 2]) {&lt;br /&gt;
                    swap(pole, j, (j - 1) / 2);&lt;br /&gt;
                    j = (j - 1) / 2;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void sort(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n);&lt;br /&gt;
&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            int j = 0, index;&lt;br /&gt;
&lt;br /&gt;
            /* Vymeň prvý a posledný prvok */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            do {&lt;br /&gt;
                index = 2 * j + 1;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka */&lt;br /&gt;
                if (index &amp;lt; i - 1 &amp;amp;&amp;amp; pole[index] &amp;lt; pole[index + 1])&lt;br /&gt;
                    index++;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu */&lt;br /&gt;
                if (index &amp;lt; i &amp;amp;&amp;amp; pole[j] &amp;lt; pole[index])&lt;br /&gt;
                    swap(pole, j, index);&lt;br /&gt;
&lt;br /&gt;
                j = index;&lt;br /&gt;
            } while (index &amp;lt; i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortIT hs = new HeapSortIT();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortRE {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            swap(pole, i, max);&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortRE hs = new HeapSortRE();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n, i):&lt;br /&gt;
    max = i     # rodic&lt;br /&gt;
    l = 2 * i + 1       # lavy potomok&lt;br /&gt;
    p = 2 * i + 2       # pravy potomok&lt;br /&gt;
&lt;br /&gt;
    # Ak je ľavý potomok väčší ako rodič&lt;br /&gt;
    if l &amp;lt; n and pole[max] &amp;lt; pole[l]:&lt;br /&gt;
        max = l&lt;br /&gt;
&lt;br /&gt;
    # Ak je pravý potomok väčší ako rodič&lt;br /&gt;
    if p &amp;lt; n and pole[max] &amp;lt; pole[p]:&lt;br /&gt;
        max = p&lt;br /&gt;
&lt;br /&gt;
    # Ak sa rodič v priebehu funkcie zmenil&lt;br /&gt;
    if max != i:&lt;br /&gt;
        pole[i], pole[max] = pole[max], pole[i]     # swap&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n, max)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    # Vytvorenie hromady&lt;br /&gt;
    for i in range(n // 2 - 1, -1, -1):&lt;br /&gt;
        heapify(pole, n, i)&lt;br /&gt;
&lt;br /&gt;
    # Extrahovanie jednotlivých elementov z hromady&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
        pole[i], pole[0] = pole[0], pole[i]     # swap&lt;br /&gt;
        heapify(pole, i, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&lt;br /&gt;
    sort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13177</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13177"/>
		<updated>2021-04-11T09:34:23Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Tento článok je v prvotnom štádiu konštrukcie, zatiaľ je to len hromada myšlienok :)==&lt;br /&gt;
odtiaľto sa odrazíme: https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý podobne ako Selection sort rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním  a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu Heapify spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady zlúčime do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme pole a index i, v ktorom chceme vytvoriť hromadu (Max Heap). Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak  porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortIT {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void heapify(int[] pole, int n) {&lt;br /&gt;
        for (int i = 1; i &amp;lt; n; i++) {&lt;br /&gt;
&lt;br /&gt;
            /* Ak je potomok väčší ako rodič */&lt;br /&gt;
            if (pole[i] &amp;gt; pole[(i - 1) / 2]) {&lt;br /&gt;
                int j = i;&lt;br /&gt;
&lt;br /&gt;
                /* Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok */&lt;br /&gt;
                while (pole[j] &amp;gt; pole[(j - 1) / 2]) {&lt;br /&gt;
                    swap(pole, j, (j - 1) / 2);&lt;br /&gt;
                    j = (j - 1) / 2;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void sort(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n);&lt;br /&gt;
&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            int j = 0, index;&lt;br /&gt;
&lt;br /&gt;
            /* Vymeň prvý a posledný prvok */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            do {&lt;br /&gt;
                index = 2 * j + 1;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka */&lt;br /&gt;
                if (index &amp;lt; i - 1 &amp;amp;&amp;amp; pole[index] &amp;lt; pole[index + 1])&lt;br /&gt;
                    index++;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu */&lt;br /&gt;
                if (index &amp;lt; i &amp;amp;&amp;amp; pole[j] &amp;lt; pole[index])&lt;br /&gt;
                    swap(pole, j, index);&lt;br /&gt;
&lt;br /&gt;
                j = index;&lt;br /&gt;
            } while (index &amp;lt; i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortIT hs = new HeapSortIT();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortRE {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            swap(pole, i, max);&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortRE hs = new HeapSortRE();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def heapify(pole, n, i):&lt;br /&gt;
    max = i     # rodic&lt;br /&gt;
    l = 2 * i + 1       # lavy potomok&lt;br /&gt;
    p = 2 * i + 2       # pravy potomok&lt;br /&gt;
&lt;br /&gt;
    # Ak je ľavý potomok väčší ako rodič&lt;br /&gt;
    if l &amp;lt; n and pole[max] &amp;lt; pole[l]:&lt;br /&gt;
        max = l&lt;br /&gt;
&lt;br /&gt;
    # Ak je pravý potomok väčší ako rodič&lt;br /&gt;
    if p &amp;lt; n and pole[max] &amp;lt; pole[p]:&lt;br /&gt;
        max = p&lt;br /&gt;
&lt;br /&gt;
    # Ak sa rodič v priebehu funkcie zmenil&lt;br /&gt;
    if max != i:&lt;br /&gt;
        pole[i], pole[max] = pole[max], pole[i]     # swap&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n, max)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sort(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    # Vytvorenie hromady&lt;br /&gt;
    for i in range(n // 2 - 1, -1, -1):&lt;br /&gt;
        heapify(pole, n, i)&lt;br /&gt;
&lt;br /&gt;
    # Extrahovanie jednotlivých elementov z hromady&lt;br /&gt;
    for i in range(n - 1, 0, -1):&lt;br /&gt;
        pole[i], pole[0] = pole[0], pole[i]     # swap&lt;br /&gt;
        heapify(pole, i, 0)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def printArray(pole):&lt;br /&gt;
    n = len(pole)&lt;br /&gt;
&lt;br /&gt;
    for i in range(n):&lt;br /&gt;
        print(pole[i])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadane pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&lt;br /&gt;
    sort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\nZoradene pole:&amp;quot;)&lt;br /&gt;
    printArray(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13176</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13176"/>
		<updated>2021-04-10T11:25:58Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Algoritmus Heap Sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Tento článok je v prvotnom štádiu konštrukcie, zatiaľ je to len hromada myšlienok :)==&lt;br /&gt;
odtiaľto sa odrazíme: https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý podobne ako Selection sort rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním  a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu Heapify spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady zlúčime do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme pole a index i, v ktorom chceme vytvoriť hromadu (Max Heap). Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak  porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortIT {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void heapify(int[] pole, int n) {&lt;br /&gt;
        for (int i = 1; i &amp;lt; n; i++) {&lt;br /&gt;
&lt;br /&gt;
            /* Ak je potomok väčší ako rodič */&lt;br /&gt;
            if (pole[i] &amp;gt; pole[(i - 1) / 2]) {&lt;br /&gt;
                int j = i;&lt;br /&gt;
&lt;br /&gt;
                /* Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok */&lt;br /&gt;
                while (pole[j] &amp;gt; pole[(j - 1) / 2]) {&lt;br /&gt;
                    swap(pole, j, (j - 1) / 2);&lt;br /&gt;
                    j = (j - 1) / 2;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void sort(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n);&lt;br /&gt;
&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            int j = 0, index;&lt;br /&gt;
&lt;br /&gt;
            /* Vymeň prvý a posledný prvok */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            do {&lt;br /&gt;
                index = 2 * j + 1;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka */&lt;br /&gt;
                if (index &amp;lt; i - 1 &amp;amp;&amp;amp; pole[index] &amp;lt; pole[index + 1])&lt;br /&gt;
                    index++;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu */&lt;br /&gt;
                if (index &amp;lt; i &amp;amp;&amp;amp; pole[j] &amp;lt; pole[index])&lt;br /&gt;
                    swap(pole, j, index);&lt;br /&gt;
&lt;br /&gt;
                j = index;&lt;br /&gt;
            } while (index &amp;lt; i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortIT hs = new HeapSortIT();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortRE {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            swap(pole, i, max);&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortRE hs = new HeapSortRE();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13175</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13175"/>
		<updated>2021-04-10T11:20:51Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Tento článok je v prvotnom štádiu konštrukcie, zatiaľ je to len hromada myšlienok :)==&lt;br /&gt;
odtiaľto sa odrazíme: https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý podobne ako Selection sort rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním  a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu Heapify spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady zlúčime do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme pole a index i, v ktorom chceme vytvoriť hromadu (Max Heap). Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak  porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iterácia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortIT {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void heapify(int[] pole, int n) {&lt;br /&gt;
        for (int i = 1; i &amp;lt; n; i++) {&lt;br /&gt;
&lt;br /&gt;
            /* Ak je potomok väčší ako rodič */&lt;br /&gt;
            if (pole[i] &amp;gt; pole[(i - 1) / 2]) {&lt;br /&gt;
                int j = i;&lt;br /&gt;
&lt;br /&gt;
                /* Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok */&lt;br /&gt;
                while (pole[j] &amp;gt; pole[(j - 1) / 2]) {&lt;br /&gt;
                    swap(pole, j, (j - 1) / 2);&lt;br /&gt;
                    j = (j - 1) / 2;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void sort(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n);&lt;br /&gt;
&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            int j = 0, index;&lt;br /&gt;
&lt;br /&gt;
            /* Vymeň prvý a posledný prvok */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            do {&lt;br /&gt;
                index = 2 * j + 1;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka */&lt;br /&gt;
                if (index &amp;lt; i - 1 &amp;amp;&amp;amp; pole[index] &amp;lt; pole[index + 1])&lt;br /&gt;
                    index++;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu */&lt;br /&gt;
                if (index &amp;lt; i &amp;amp;&amp;amp; pole[j] &amp;lt; pole[index])&lt;br /&gt;
                    swap(pole, j, index);&lt;br /&gt;
&lt;br /&gt;
                j = index;&lt;br /&gt;
            } while (index &amp;lt; i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortIT hs = new HeapSortIT();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzia Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortRE {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            swap(pole, i, max);&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortRE hs = new HeapSortRE();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13174</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13174"/>
		<updated>2021-04-10T11:17:05Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Tento článok je v prvotnom štádiu konštrukcie, zatiaľ je to len hromada myšlienok :)==&lt;br /&gt;
odtiaľto sa odrazíme: https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý podobne ako Selection sort rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním  a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu Heapify spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady zlúčime do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme pole a index i, v ktorom chceme vytvoriť hromadu (Max Heap). Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak  porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSort_Iteracia {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void heapify(int[] pole, int n) {&lt;br /&gt;
        for (int i = 1; i &amp;lt; n; i++) {&lt;br /&gt;
&lt;br /&gt;
            /* Ak je potomok väčší ako rodič */&lt;br /&gt;
            if (pole[i] &amp;gt; pole[(i - 1) / 2]) {&lt;br /&gt;
                int j = i;&lt;br /&gt;
&lt;br /&gt;
                /* Vymieňaj elementy (rodič, potomok), dokým je rodič menší ako potomok */&lt;br /&gt;
                while (pole[j] &amp;gt; pole[(j - 1) / 2]) {&lt;br /&gt;
                    swap(pole, j, (j - 1) / 2);&lt;br /&gt;
                    j = (j - 1) / 2;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void sort(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        heapify(pole, n);&lt;br /&gt;
&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            int j = 0, index;&lt;br /&gt;
&lt;br /&gt;
            /* Vymeň prvý a posledný prvok */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            do {&lt;br /&gt;
                index = 2 * j + 1;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je ľavý potomok menši ako pravý, presuň 'index' na pravého potomka */&lt;br /&gt;
                if (index &amp;lt; i - 1 &amp;amp;&amp;amp; pole[index] &amp;lt; pole[index + 1])&lt;br /&gt;
                    index++;&lt;br /&gt;
&lt;br /&gt;
                /* Ak je rodič menší ako potomok, tak ho vymeň s potomkom, ktorý má väčšiu hodnotu */&lt;br /&gt;
                if (index &amp;lt; i &amp;amp;&amp;amp; pole[j] &amp;lt; pole[index])&lt;br /&gt;
                    swap(pole, j, index);&lt;br /&gt;
&lt;br /&gt;
                j = index;&lt;br /&gt;
            } while (index &amp;lt; i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSort_Iteracia hs = new HeapSort_Iteracia();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSort_Rekurzia {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            swap(pole, i, max);&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSort_Rekurzia hs = new HeapSort_Rekurzia();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13173</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13173"/>
		<updated>2021-04-10T10:41:30Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Tento článok je v prvotnom štádiu konštrukcie, zatiaľ je to len hromada myšlienok :)==&lt;br /&gt;
odtiaľto sa odrazíme: https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý podobne ako Selection sort rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním  a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu Heapify spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady zlúčime do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme pole a index i, v ktorom chceme vytvoriť hromadu (Max Heap). Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak  porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortRE {&lt;br /&gt;
    void swap(int[] pole, int a, int b) {&lt;br /&gt;
        int tmp = pole[a];&lt;br /&gt;
        pole[a] = pole[b];&lt;br /&gt;
        pole[b] = tmp;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            swap(pole, i, max);&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            swap(pole, 0, i);&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortRE hs = new HeapSortRE();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13172</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13172"/>
		<updated>2021-04-10T10:35:25Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Tento článok je v prvotnom štádiu konštrukcie, zatiaľ je to len hromada myšlienok :)==&lt;br /&gt;
odtiaľto sa odrazíme: https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý podobne ako Selection sort rozeľuje pole na zotriedenú a nezotriedenú časť, pričom  nezotriedená časť predstavuje dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si zo vstupného poľa vytvoríme binárnu hromadu a následne postupným vyberaním  a mazaním všetkých jej prvkov toto pole utriedime.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Princíp algoritmu Heapify spočíva v tom, že ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom tieto dve podhromady zlúčime do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podhromady).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Na vstupe prijmeme pole a index i, v ktorom chceme vytvoriť hromadu (Max Heap). Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2) z časti &amp;quot;Prehľad&amp;quot;). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje vrchol jednoprvkovej hromady. Ak má práve jedného potomka, tento potomok je zároveň jeho maximálnym potomkom. Ak má práve dvoch potomkov, tak  porovnáme ich hodnoty a vyberieme z nich maximálneho potomka. Následne skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože želaná hromada už je utvorená. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:::1.5. Skoč na krok 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class HeapSortRE {&lt;br /&gt;
    void heapify(int[] pole, int n, int i) {&lt;br /&gt;
        int max = i; // rodič&lt;br /&gt;
        int l = 2 * i + 1; // ľavý potomok&lt;br /&gt;
        int p = 2 * i + 2; // pravý potomok&lt;br /&gt;
&lt;br /&gt;
        /* Ak je ľavý potomok väčší ako rodič */&lt;br /&gt;
        if (l &amp;lt; n &amp;amp;&amp;amp; pole[l] &amp;gt; pole[max])&lt;br /&gt;
            max = l;&lt;br /&gt;
&lt;br /&gt;
        /* Ak je pravý potomok väčší ako rodič */&lt;br /&gt;
        if (p &amp;lt; n &amp;amp;&amp;amp; pole[p] &amp;gt; pole[max])&lt;br /&gt;
            max = p;&lt;br /&gt;
&lt;br /&gt;
        /* Ak sa rodič v priebehu funkcie zmenil */&lt;br /&gt;
        if (max != i) {&lt;br /&gt;
            int swap = pole[i];&lt;br /&gt;
            pole[i] = pole[max];&lt;br /&gt;
            pole[max] = swap;&lt;br /&gt;
&lt;br /&gt;
            heapify(pole, n, max);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void sort(int[] pole) {&lt;br /&gt;
       int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
       /* Vytvorenie hromadu */&lt;br /&gt;
        for (int i = n / 2 - 1; i &amp;gt;= 0 ; i--)&lt;br /&gt;
            heapify(pole, n, i);&lt;br /&gt;
&lt;br /&gt;
        /* Extrahovanie jednotlivých elemetov z hromady */&lt;br /&gt;
        for (int i = n - 1; i &amp;gt; 0; i--) {&lt;br /&gt;
            /* Presuň aktuálneho rodiča na koniec */&lt;br /&gt;
            int swap = pole[0];&lt;br /&gt;
            pole[0] = pole[i];&lt;br /&gt;
            pole[i] = swap;&lt;br /&gt;
&lt;br /&gt;
            /* Zavolanie heapify na zredukovanú hromadu */&lt;br /&gt;
            heapify(pole, i, 0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    static void printArray(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i : pole)&lt;br /&gt;
            System.out.print(i + &amp;quot; &amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
	    int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole pred zoradenim: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
&lt;br /&gt;
	    HeapSortRE hs = new HeapSortRE();&lt;br /&gt;
	    hs.sort(pole);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Pole po zoradeni: &amp;quot;);&lt;br /&gt;
        printArray(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13163</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13163"/>
		<updated>2021-04-08T13:34:06Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Heap Sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Tento článok je v prvotnom štádiu konštrukcie, zatiaľ je to len hromada myšlienok :)==&lt;br /&gt;
odtiaľto sa odrazíme: https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý na triedenie využíva dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si algoritmus vytvorí binárnu hromadu zo vstupného poľa a následne postupným mazaním všetkých jej prvkov toto pole utriedi.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom funkcia Heapify zlúči tieto dve podhromady do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(N))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podstromu).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Dostaneme na vstupe pole a index i, v ktorom chceme vytvoriť hromadu. Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2)). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje jednoprvkovú hromadu. Ak má práve jedného potomka, tento potomok je zároveň maximálnym potomkom. Ak má práve dvoch potomkov, tak z nich vyberieme maximálneho potomka.&lt;br /&gt;
Následne Skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože prvok i predstavuje vrchol hromady. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:2. Skoč na krok 1.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|500px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13162</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13162"/>
		<updated>2021-04-08T13:19:54Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Heap Sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Tento článok je v prvotnom štádiu konštrukcie, zatiaľ je to len hromada myšlienok :)==&lt;br /&gt;
odtiaľto sa odrazíme: https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý na triedenie využíva dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si algoritmus vytvorí binárnu hromadu zo vstupného poľa a následne postupným mazaním všetkých jej prvkov toto pole utriedi.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom funkcia Heapify zlúči tieto dve podhromady do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(N))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podstromu).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Dostaneme na vstupe pole a index i, v ktorom chceme vytvoriť hromadu. Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2)). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje jednoprvkovú hromadu. Ak má práve jedného potomka, tento potomok je zároveň maximálnym potomkom. Ak má práve dvoch potomkov, tak z nich vyberieme maximálneho potomka.&lt;br /&gt;
Následne Skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože prvok i predstavuje vrchol hromady. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:2. Skoč na krok 1.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|950px|náhľad|stred]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13161</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13161"/>
		<updated>2021-04-08T13:18:23Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Algoritmus Heap Sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Tento článok je v prvotnom štádiu konštrukcie, zatiaľ je to len hromada myšlienok :)==&lt;br /&gt;
odtiaľto sa odrazíme: https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý na triedenie využíva dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si algoritmus vytvorí binárnu hromadu zo vstupného poľa a následne postupným mazaním všetkých jej prvkov toto pole utriedi.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom funkcia Heapify zlúči tieto dve podhromady do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(N))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podstromu).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Dostaneme na vstupe pole a index i, v ktorom chceme vytvoriť hromadu. Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2)). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje jednoprvkovú hromadu. Ak má práve jedného potomka, tento potomok je zároveň maximálnym potomkom. Ak má práve dvoch potomkov, tak z nich vyberieme maximálneho potomka.&lt;br /&gt;
Následne Skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože prvok i predstavuje vrchol hromady. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:2. Skoč na krok 1.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Súbor:HeapSort.png|950px|náhľad]]&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13160</id>
		<title>Triedenie výberom</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13160"/>
		<updated>2021-04-08T13:14:22Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Heap Sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Tento článok je v prvotnom štádiu konštrukcie, zatiaľ je to len hromada myšlienok :)==&lt;br /&gt;
odtiaľto sa odrazíme: https://en.wikipedia.org/wiki/Heapsort&lt;br /&gt;
&lt;br /&gt;
==Heap Sort==&lt;br /&gt;
&lt;br /&gt;
===Prehľad===&lt;br /&gt;
Heap Sort je triediaci algoritmus, ktorý na triedenie využíva dátovú štruktúru [[Hromada|binárna hromada]]. Celé triedenie spočíva v tom, že si algoritmus vytvorí binárnu hromadu zo vstupného poľa a následne postupným mazaním všetkých jej prvkov toto pole utriedi.&lt;br /&gt;
 &lt;br /&gt;
Hromada, ktorú využíva algoritmus Heap Sort, musí spĺňať nasledovné podmienky (ak indexujeme pole od 0):&lt;br /&gt;
:1. Vrchol hromady (koreň) je vždy prvý prvok v poli (v našom prípade prvok na 0-tej pozícii).&lt;br /&gt;
:2. Pre ľubovoľný prvok (uzol), uložený na indexe &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; z intervalu &amp;lt;math&amp;gt; \langle 0 \ ; \ \text{dĺžka} - 1 \rangle &amp;lt;/math&amp;gt;, platia nasledovné rovnice:&lt;br /&gt;
:: &amp;lt;math&amp;gt; &lt;br /&gt;
\begin{align}&lt;br /&gt;
\text{ľavý potomok} &amp;amp;= 2i + 1   &amp;amp;&amp;amp; (1) \\&lt;br /&gt;
\text{pravý potomok} &amp;amp;= 2i + 2  &amp;amp;&amp;amp; (2) \\&lt;br /&gt;
\text{rodič} &amp;amp;= \left \lfloor \frac{i - 1}{2} \right \rfloor \quad (\text {okrem} \ i = 0) &amp;amp;&amp;amp; (3)&lt;br /&gt;
\end{align}&lt;br /&gt;
&amp;lt;/math&amp;gt; &lt;br /&gt;
:3. Každý prvok (uzol) v hromade musí mať väčšiu, alebo rovnakú hodnotu ako jeho potomkovia (MAX HEAP - ak triedime pole vzostupne, v opačnom prípade by sme použili MIN HEAP).&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heapify=== &lt;br /&gt;
[[Súbor:Heapify.png|vizualizácia|699px|náhľad|vpravo]]&lt;br /&gt;
Heapify je kľúčovým podprogramom triediaceho algoritmu Heap Sort, vďaka ktorému vieme efektíve zabezpečiť vytvorenie hromady z poľa a zmazanie hromady. &lt;br /&gt;
&lt;br /&gt;
Ak máme i-ty prvok v poli (v kompletnom binárnom strome), ktorého potomkovia tvoria dve samostatné podhromady, potom funkcia Heapify zlúči tieto dve podhromady do jednej hromady, pričom i-ty prvok bude jej vrcholom.&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* dátová štruktúra: hromada (reprezentovaná ako: pole, strom)&lt;br /&gt;
* časová zložitosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová zložitosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, &amp;lt;math&amp;gt;O(log(N))&amp;lt;/math&amp;gt; pri rekurzívnej verzii&lt;br /&gt;
&lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# Určenie potomka s maximálnou hodnotou i-teho prvku.&lt;br /&gt;
# Porovnanie maximálneho potomka s rodičom (i-tym prvkom).&lt;br /&gt;
# Ak je potomok väčší ako rodič, tak výmena potomka a rodiča.&lt;br /&gt;
# Ak nastala výmena, skontrolovanie ovplyvneného potomka (podstromu).&lt;br /&gt;
&lt;br /&gt;
====Slovný opis algoritmu====&lt;br /&gt;
Dostaneme na vstupe pole a index i, v ktorom chceme vytvoriť hromadu. Najskôr skontrolujeme, či prvok na indexe i má nejakých potomkov (využijeme rovnice (1) a (2)). Ak nemá žiadnych potomkov, funkcia skončí, pretože i predstavuje jednoprvkovú hromadu. Ak má práve jedného potomka, tento potomok je zároveň maximálnym potomkom. Ak má práve dvoch potomkov, tak z nich vyberieme maximálneho potomka.&lt;br /&gt;
Následne Skontrolujeme veľkosť maximálneho potomka a jeho rodiča (prvok na indexe i). Ak je rodič väčší, funkcia skončí, pretože prvok i predstavuje vrchol hromady. Ak nie, vymeníme rodiča a maximálneho potomka. Ak nastala výmena, musíme skontrolovať ovplyvnenú podhromadu, tj. zopakovať tento sled krokov pre podhromadu, ktorej vrchol bude v maximálnom potomkovi i-teho prvku.&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť iteračnú aj rekurzívnu verziu.&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;2 * i + 1 &amp;lt; dlzka&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 1.1., inak skonči.&lt;br /&gt;
:::1.1. Nech: &amp;lt;code&amp;gt;lavy = 2 * i + 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.2. Nech: &amp;lt;code&amp;gt;pravy = 2 * i + 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.3. Je &amp;lt;code&amp;gt;pravy &amp;lt; dlzka&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;pole[pravy] &amp;gt; pole[lavy]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno: &lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie:&lt;br /&gt;
:::::::1.3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::1.4. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::Ak áno:&lt;br /&gt;
:::::::1.4.1. Vymeň: &amp;lt;code&amp;gt;pole[max]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::1.4.2. &amp;lt;code&amp;gt;i = max&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::Ak nie: &lt;br /&gt;
:::::::1.4.1 Skonči.&lt;br /&gt;
:2. Skoč na krok 1.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech funkcia Heapify má nasledovný prototyp &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;pole[2 * i + 1] &amp;gt;= pole[2 * i + 2]&amp;lt;/code&amp;gt; ?&lt;br /&gt;
::: Ak áno:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 1]&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::1.1. Nech: &amp;lt;code&amp;gt;max = pole[2 * i + 2]&amp;lt;/code&amp;gt; &lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 2.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 2.2. Rekurzívne zavolaj: &amp;lt;code&amp;gt;Heapify(pole[], dlzka, max)&amp;lt;/code&amp;gt;&lt;br /&gt;
::: Ak nie:&lt;br /&gt;
::::: 2.1. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Algoritmus Heap Sort===&lt;br /&gt;
Heapsort pri triedení vykonáva dve základné úlohy: Vytvorenie maximálnej binárnej hromady zo vstupného poľa a mazanie jednotlivých prvkov z hromady. Pri oboch procedúrach využíva algoritmus Heapify&lt;br /&gt;
&lt;br /&gt;
====Vlastnosti algoritmu====&lt;br /&gt;
* vhodný pre dátové štruktúry: pole &lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n\log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké polia&lt;br /&gt;
* priestorová náročnosť: konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pri iteračnej verzii, logaritmická &amp;lt;math&amp;gt;O(\log(n))&amp;lt;/math&amp;gt; pri rekurzívnej verzii.&lt;br /&gt;
* druh triedenia: triedenie výberom (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: nestabilný&lt;br /&gt;
* miesto triedenia: vnútorné triedenie &lt;br /&gt;
====Základné časti algoritmu====&lt;br /&gt;
# vytvorenie hromady&lt;br /&gt;
# zmazanie hromady&lt;br /&gt;
====Slovný opis====&lt;br /&gt;
[[Súbor:HeapSort.png|500px|náhľad]]&lt;br /&gt;
=====Vytvorenie hromady=====&lt;br /&gt;
Pri vytváraní hromady využijeme algoritmus heapify, pričom hromadu vytvoríme spôsobom zospodu na vrch. Najskôr si určíme prvok ktorý je najspodnejší a najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme veľmi jednoducho, pretože zpberieme posledný prvok v poli, a pomocou rovnice 3, ktorú si jemne upravíme mu nájdeme rodiča: &amp;lt;math&amp;gt; \text{posledný rodič} = \left \lfloor \frac{\text{posledný index } - 1}{2}   \right \rfloor  = \left \lfloor\frac{\text{dĺžka } - 2}{2} \right \rfloor = \left \lfloor \frac{\text{dĺžka}}{2}\right \rfloor  - 1  &amp;lt;/math&amp;gt;&lt;br /&gt;
Následne zavoláme Heapify na podhromadu s vrcholom posledného rodiča. Potom zmenšíme o 1 a opakujeme tento proces , až kým neprídeme na začiatok. Schematicky by sme to mohli napísať takto:&lt;br /&gt;
&amp;lt;math&amp;gt; \text{pre } i \text{ z intervalu } \left \langle \left \lfloor \frac {\text{dĺžka}}{2} \right \rfloor - 1 \quad  ; \quad 0 \right \rangle :\  \text{heapify( pole[],  dĺžka,  i )}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Zmazanie hromady=====&lt;br /&gt;
Pri mazaní hromady vykonáme dve operácie. Ako prvé vymeníme  prvok na vrchu hromady s koncovým prvkom hromady. Prvok čo je na komci považujeme za zmazaný, preto veľkosť hromady znížime o 1. Následne musíme zabezpečiť zachovanie pravidiel pre hromadu, takže zavoláme funkciu Heapify na celú hromadu (index i bude vrch hromady, čiže 0-tý prvok v poli). Tento proces opakujeme, poikiaľ v hromade neostanú žiadne prvky.&lt;br /&gt;
&lt;br /&gt;
Poznámka: v našom prípade nemusíme mazať celú hromadu, ale iba do chvíle, keď nám neostane 1 prvok.&lt;br /&gt;
&lt;br /&gt;
Schematicky by sme to mohli zapísať takto:&lt;br /&gt;
&amp;lt;math&amp;gt;\text{pre } j \text{ z intervalu } \left \langle \text{dĺžka - 1} \quad ; \quad 0 \right \rangle : \ \  \text{vymeň(pole[0], pole[$j$])} \ \ a \ \ \text{heapify(pole[], dĺžka, 0)} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Pseudokód====&lt;br /&gt;
Nech funkcia Heap Sort má nasledovný prototyp: &amp;lt;code&amp;gt;HeapSort(pole[], dlzka)&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
:1. Nech: &amp;lt;code&amp;gt;i = dlzka / 2 - 1&amp;lt;/code&amp;gt;, kde &amp;quot;/&amp;quot; predstavuje celočíslené delenie.&lt;br /&gt;
:2. Je &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 2.1., inak skoč na krok 3.&lt;br /&gt;
:::2.1. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::2.2. Skoč na krok 2.&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;j = dlzka - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:4 Je &amp;lt;code&amp;gt; j &amp;gt; 0&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Vymeň: &amp;lt;code&amp;gt;pole[0]&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pole[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.2. Zavolaj funkciu &amp;lt;code&amp;gt;Heapify(pole[], dlzka, i)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3. Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Implementácia algoritmov Heapify a HeapSort v rôznych programovacích jazykoch===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
    int pravy, lavy, max;&lt;br /&gt;
&lt;br /&gt;
    while(2 * index + 1 &amp;lt; dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        lavy = 2 * index + 1;&lt;br /&gt;
        pravy = 2 * index + 2;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            index = max;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b);&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index);&lt;br /&gt;
void HeapSort(int pole[], int dlzka);&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[]= {10, 5, 2, 9, 8, 7, 1, 3, 4, 0, -1, -1};&lt;br /&gt;
    int dlzka = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    HeapSort(pole, dlzka);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Vymen(int *a, int *b)&lt;br /&gt;
{&lt;br /&gt;
    int tmp = *a;&lt;br /&gt;
    *a = *b;&lt;br /&gt;
    *b = tmp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Heapify(int pole[], int dlzka, int index)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        int lavy = 2 * index + 1;&lt;br /&gt;
        int pravy = 2 * index + 2;&lt;br /&gt;
        int max = index;&lt;br /&gt;
&lt;br /&gt;
        // určenie potomka s maximálnou hodnotou&lt;br /&gt;
        if(lavy &amp;lt; dlzka &amp;amp;&amp;amp; pole[lavy] &amp;gt;= pole[pravy])&lt;br /&gt;
        {&lt;br /&gt;
            max = lavy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(pravy &amp;lt; dlzka &amp;amp;&amp;amp; pole[pravy] &amp;gt; pole[lavy])&lt;br /&gt;
        {&lt;br /&gt;
            max = pravy;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // porovnanie maximálneho potomka s rodičom&lt;br /&gt;
        if(pole[max] &amp;gt; pole[index])&lt;br /&gt;
        {&lt;br /&gt;
            Vymen(&amp;amp;pole[max], &amp;amp;pole[index]);&lt;br /&gt;
            Heapify(pole, dlzka, max);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void HeapSort(int pole[], int dlzka)&lt;br /&gt;
{&lt;br /&gt;
    // vytvor  maximálnu hromadu (procedúra BuildMaxHeap)&lt;br /&gt;
    for (int i = dlzka / 2 - 1 ; i &amp;gt;= 0; --i)&lt;br /&gt;
    {&lt;br /&gt;
        Heapify(pole, dlzka, i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // zmaž všetky prvky z hromady&lt;br /&gt;
    for (int j = dlzka - 1; j &amp;gt; 0; --j)&lt;br /&gt;
    {&lt;br /&gt;
        Vymen(&amp;amp;pole[0], &amp;amp;pole[j]);&lt;br /&gt;
        Heapify(pole, j, 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Selection Sort==&lt;br /&gt;
Coming soon :)&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
https://www.tutorialspoint.com/design_and_analysis_of_algorithms/design_and_analysis_of_algorithms_heapify_method.htm&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13094</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13094"/>
		<updated>2021-03-30T17:11:52Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Zlučovací algoritmus Merge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie ''Merge'': Máme pole prvkov ''p = [1, 3, 5, 2, 4, 6]'', ktoré je už čiastočne utriedené. Použijeme algoritmus ''Merge'', ktorý si vytvorí pomocné polia ''L = [1, 3, 5]'' a ''P = [2, 4, 6]''. Všetky polia indexujeme od ''0'', pričom pre pole ''p'' používame index ''k'', pre ''L'' index ''i'' a pre ''P'' index ''j''. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinujeme do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus ''Merge'' tvorí kľúčovú časť triediaceho algoritmu ''Merge Sort''.&lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus ''Merge Sort''&lt;br /&gt;
&lt;br /&gt;
===Základné časti algoritmu===&lt;br /&gt;
# Vytvorenie pomocných polí.&lt;br /&gt;
# Prechádzanie pomocných polí a vyberanie minima z 2 prvkov.&lt;br /&gt;
# Vkladanie minima na začiatok výsledného poľa.&lt;br /&gt;
# Kopírovanie prvkov, ktoré ešte neboli porovnané, z pomocného poľa do výsledného poľa.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme vstupné pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia ''L'' a ''P'' a do každého z nich skopírujeme obsah jednej polovice (''L'' - ľavá polovica, ''P'' - pravá polovica). Potom súčasne prechádzame polia ''L'' a ''P'' od začiatku po koniec, pričom v každej iterácii porovnáme prvok poľa ''L'' s prvkom v poli ''P''. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí ''P'' a ''L''. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia ''Merge'' má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge Sort==&lt;br /&gt;
''Merge Sort'' je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na menšie časti, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to ''rekurzívnu'' a ''iteračnú''.&lt;br /&gt;
&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu Merge Sort: chronologický priebeh algoritmu je znázornený číslicami 1 až 19.]]&lt;br /&gt;
&lt;br /&gt;
===Základné časti algoritmu===&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min -&amp;gt; max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (''začiatok ... stred ; stred + 1 ... koniec'') až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu ''Merge'' do väčších podpolí (max: 2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort IT.png|400px|náhľad|Vizualizácia iteračnej verzie algoritmu Merge Sort: chronologický priebeh algoritmu je znázornený číslicami 1 až 7.|vpravo]]&lt;br /&gt;
&lt;br /&gt;
===Základné časti algoritmu===&lt;br /&gt;
# Určenie maximálnej veľkosti podpoľa na zlučovanie.&lt;br /&gt;
# Prechádzanie jednotlivých podpolí v poli.&lt;br /&gt;
# Zlučovanie jednotlivých podpolí pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N'' - prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvej iterácii zlúčime každé dva prvky, čím dostaneme &amp;lt;math&amp;gt;\frac{N}{2}&amp;lt;/math&amp;gt; dvojprvkových utriedených podpolí. Potom v druhej iterácii zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, ..., až do momentu, keď dostaneme jedno výsledné  utriedené pole. &lt;br /&gt;
Aby sme mohli túto stratégiu implementovať, potrebujeme dva cykly: vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... ''dlzka - 1'') a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu ''Merge'', ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme ''pole'', ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvej iterácii, ale až v tých ďalších. Takisto, ak ''N'' nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad ''pole'', čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7 + 0)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_podpola = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je &amp;lt;code&amp;gt;dlzka_podpola &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je &amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech: &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_podpola - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech: &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_podpola - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_podpola - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_podpola&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_podpole *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_podpola = 1; dlzka_podpola &amp;lt;= pravy; dlzka_podpola *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_podpola)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_podpola - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_podpola - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_podpola - 1 &amp;lt;= pravy) ? zaciatok + dlzka_podpola - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_podpola = 1; dlzka_podpola &amp;lt;= pravy; dlzka_podpola *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_podpola)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_podpola - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_podpola - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_podpola - 1 &amp;lt;= pravy) ? zaciatok + dlzka_podpola - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * podpole1 [ľavý ... stred]&lt;br /&gt;
     * podpole2 [stred + 1 ... pravý] &lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpolí nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do poľa,&lt;br /&gt;
         * tak sa do poľa jednoducho skopírujú &lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred poľa&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu poľa samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného poľa&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis poľa dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia &lt;br /&gt;
{&lt;br /&gt;
    /* Zlúči 2 podpolia, ktoré sa vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * podpole1 [ľavý..stred]&lt;br /&gt;
     * podpole2 [stred+1..pravý] &lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j])&lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom z podpolí sa nachádzajú prvky, ktoré neboli zlúčené do poľa,&lt;br /&gt;
         * tak sa do poľa jednoducho skopírujú &lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int n) &lt;br /&gt;
    {&lt;br /&gt;
        /* Dĺžka podpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
&lt;br /&gt;
        /* Začiatočný index ľavého podpoľa, ktoré má byť zlúčené */&lt;br /&gt;
&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia podpolia veľkosti 1 do podpolí veľkosti 2,&lt;br /&gt;
        * potom podpolia veľkosti 2 do podpolí veľkosti 4 a tak ďalej &lt;br /&gt;
        */&lt;br /&gt;
&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) &lt;br /&gt;
        {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych podpolí aktuálnej dĺžky podpoľa */&lt;br /&gt;
&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) &lt;br /&gt;
            {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého podpoľa, stred+1 je začiatočný prvok pravého podpoľa */&lt;br /&gt;
&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči podpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia na výpis poľa dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia poľa */&lt;br /&gt;
&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
&lt;br /&gt;
        # Nájdenie stredu poľa&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka poľa sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie poľa na dve časti&lt;br /&gt;
&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti poľa, potom druhej&lt;br /&gt;
&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného poľa&lt;br /&gt;
&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného poľa jednoducho skopírujú&lt;br /&gt;
&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
&lt;br /&gt;
    # Dĺžka podpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje podpolia aktuálnej dĺžky&lt;br /&gt;
&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie podpolí do jedného podpoľa&lt;br /&gt;
&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku podpoľa pripočítame aktuálnu&lt;br /&gt;
            # dĺžku podpolí a odčítame 1&lt;br /&gt;
&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka poľa - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžka poľa - 1&lt;br /&gt;
&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného poľa&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13093</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13093"/>
		<updated>2021-03-29T18:03:38Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie ''Merge'': Máme pole prvkov ''p = [1, 3, 5, 2, 4, 6]'', ktoré je už čiastočne utriedené. Použijeme algoritmus ''Merge'', ktorý si vytvorí pomocné polia ''L = [1, 3, 5]'' a ''P = [2, 4, 6]''. Všetky polia indexujeme od ''0'', pričom pre pole ''p'' používame index ''k'', pre ''L'' index ''i'' a pre ''P'' index ''j''. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinujeme do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus ''Merge'' tvorí kľúčovú časť triediaceho algoritmu ''Merge Sort''.&lt;br /&gt;
&lt;br /&gt;
===Základné časti algoritmu===&lt;br /&gt;
# Vytvorenie pomocných polí.&lt;br /&gt;
# Prechádzanie pomocných polí a vyberanie minima z 2 prvkov.&lt;br /&gt;
# Vkladanie minima na začiatok výsledného poľa.&lt;br /&gt;
# Kopírovanie prvkov, ktoré ešte neboli porovnané, z pomocného poľa do výsledného poľa.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme vstupné pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia ''L'' a ''P'' a do každého z nich skopírujeme obsah jednej polovice (''L'' - ľavá polovica, ''P'' - pravá polovica). Potom súčasne prechádzame polia ''L'' a ''P'' od začiatku po koniec, pričom v každej iterácii porovnáme prvok poľa ''L'' s prvkom v poli ''P''. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí ''P'' a ''L''. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus ''Merge Sort''&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia ''Merge'' má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge Sort==&lt;br /&gt;
''Merge Sort'' je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na menšie časti, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to ''rekurzívnu'' a ''iteračnú''.&lt;br /&gt;
&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu Merge Sort: chronologický priebeh algoritmu je znázornený číslicami 1 až 19.]]&lt;br /&gt;
&lt;br /&gt;
===Základné časti algoritmu===&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min -&amp;gt; max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (''začiatok ... stred ; stred + 1 ... koniec'') až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu ''Merge'' do väčších podpolí (max: 2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort IT.png|400px|náhľad|Vizualizácia iteračnej verzie algoritmu Merge Sort: chronologický priebeh algoritmu je znázornený číslicami 1 až 7.|vpravo]]&lt;br /&gt;
&lt;br /&gt;
===Základné časti algoritmu===&lt;br /&gt;
# Určenie maximálnej veľkosti podpoľa na zlučovanie.&lt;br /&gt;
# Prechádzanie jednotlivých podpolí v poli.&lt;br /&gt;
# Zlučovanie jednotlivých podpolí pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N'' - prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvej iterácii zlúčime každé dva prvky, čím dostaneme &amp;lt;math&amp;gt;\frac{N}{2}&amp;lt;/math&amp;gt; dvojprvkových utriedených podpolí. Potom v druhej iterácii zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, ..., až do momentu, keď dostaneme jedno výsledné  utriedené pole. &lt;br /&gt;
Aby sme mohli túto stratégiu implementovať, potrebujeme dva cykly: vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... ''dlzka - 1'') a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu ''Merge'', ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme ''pole'', ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvej iterácii, ale až v tých ďalších. Takisto, ak ''N'' nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad ''pole'', čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7 + 0)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_podpola = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je &amp;lt;code&amp;gt;dlzka_podpola &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je &amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech: &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_podpola - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech: &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_podpola - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_podpola - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_podpola&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_podpole *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_podpola = 1; dlzka_podpola &amp;lt;= pravy; dlzka_podpola *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_podpola)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_podpola - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_podpola - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_podpola - 1 &amp;lt;= pravy) ? zaciatok + dlzka_podpola - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_podpola = 1; dlzka_podpola &amp;lt;= pravy; dlzka_podpola *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_podpola)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_podpola - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_podpola - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_podpola - 1 &amp;lt;= pravy) ? zaciatok + dlzka_podpola - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * podpole1 [ľavý ... stred]&lt;br /&gt;
     * podpole2 [stred + 1 ... pravý] &lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpolí nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do poľa,&lt;br /&gt;
         * tak sa do poľa jednoducho skopírujú &lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred poľa&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu poľa samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného poľa&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis poľa dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia &lt;br /&gt;
{&lt;br /&gt;
    /* Zlúči 2 podpolia, ktoré sa vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * podpole1 [ľavý..stred]&lt;br /&gt;
     * podpole2 [stred+1..pravý] &lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j])&lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom z podpolí sa nachádzajú prvky, ktoré neboli zlúčené do poľa,&lt;br /&gt;
         * tak sa do poľa jednoducho skopírujú &lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int n) &lt;br /&gt;
    {&lt;br /&gt;
        /* Dĺžka podpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
&lt;br /&gt;
        /* Začiatočný index ľavého podpoľa, ktoré má byť zlúčené */&lt;br /&gt;
&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia podpolia veľkosti 1 do podpolí veľkosti 2,&lt;br /&gt;
        * potom podpolia veľkosti 2 do podpolí veľkosti 4 a tak ďalej &lt;br /&gt;
        */&lt;br /&gt;
&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) &lt;br /&gt;
        {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych podpolí aktuálnej dĺžky podpoľa */&lt;br /&gt;
&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) &lt;br /&gt;
            {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého podpoľa, stred+1 je začiatočný prvok pravého podpoľa */&lt;br /&gt;
&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči podpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia na výpis poľa dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia poľa */&lt;br /&gt;
&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
&lt;br /&gt;
        # Nájdenie stredu poľa&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka poľa sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie poľa na dve časti&lt;br /&gt;
&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti poľa, potom druhej&lt;br /&gt;
&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného poľa&lt;br /&gt;
&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného poľa jednoducho skopírujú&lt;br /&gt;
&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
&lt;br /&gt;
    # Dĺžka podpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje podpolia aktuálnej dĺžky&lt;br /&gt;
&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie podpolí do jedného podpoľa&lt;br /&gt;
&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku podpoľa pripočítame aktuálnu&lt;br /&gt;
            # dĺžku podpolí a odčítame 1&lt;br /&gt;
&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka poľa - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžka poľa - 1&lt;br /&gt;
&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného poľa&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13082</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13082"/>
		<updated>2021-03-29T17:09:55Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Zlučovací algoritmus Merge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie ''Merge'': Máme pole prvkov ''p = [1, 3, 5, 2, 4, 6]'', ktoré je už čiastočne utriedené. Použijeme algoritmus ''Merge'', ktorý si vytvorí pomocné polia ''L = [1, 3, 5]'' a ''P = [2, 4, 6]''. Všetky polia indexujeme od ''0'', pričom pre pole ''p'' používame index ''k'', pre ''L'' index ''i'' a pre ''P'' index ''j''. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinujeme do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus ''Merge'' tvorí kľúčovú časť triediaceho algoritmu ''MergeSort''.&lt;br /&gt;
&lt;br /&gt;
===Základné časti algoritmu===&lt;br /&gt;
# Vytvorenie pomocných polí.&lt;br /&gt;
# Prechádzanie pomocných polí a vyberanie minima z 2 prvkov.&lt;br /&gt;
# Vkladanie minima na začiatok výsledného poľa.&lt;br /&gt;
# Kopírovanie prvkov, ktoré ešte neboli porovnané, z pomocného poľa do výsledného poľa.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme vstupné pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia ''L'' a ''P'' a do každého z nich skopírujeme obsah jednej polovice (''L'' - ľavá polovica, ''P'' - pravá polovica). Potom súčasne prechádzame polia ''L'' a ''P'' od začiatku po koniec, pričom v každej iterácii porovnáme prvok poľa ''L'' s prvkom v poli ''P''. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí ''P'' a ''L''. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus ''Merge Sort''&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia ''Merge'' má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==MergeSort==&lt;br /&gt;
''MergeSort'' je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na menšie časti, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to ''rekurzívnu'' a ''iteračnú''.&lt;br /&gt;
&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Základné časti algoritmu===&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min -&amp;gt; max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (''začiatok ... stred ; stred + 1 ... koniec'') až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu ''Merge'' do väčších podpolí (max: 2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort IT.png|400px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
===Základné časti algoritmu===&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... ''dlzka - 1'') a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu ''Merge'', ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme ''pole'', ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak ''N'' nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad ''pole'', čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_podpola = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_podpola &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_podpola - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_podpola - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_podpola - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_podpola&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_podpole *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * podpole1 [ľavý ... stred]&lt;br /&gt;
     * podpole2 [stred + 1 ... pravý] &lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpolí nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do poľa,&lt;br /&gt;
         * tak sa do poľa jednoducho skopírujú &lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred poľa&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu poľa samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného poľa&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis poľa dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia &lt;br /&gt;
{&lt;br /&gt;
    /* Zlúči 2 podpolia, ktoré sa vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * podpole1 [ľavý..stred]&lt;br /&gt;
     * podpole2 [stred+1..pravý] &lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j])&lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom z podpolí sa nachádzajú prvky, ktoré neboli zlúčené do poľa,&lt;br /&gt;
         * tak sa do poľa jednoducho skopírujú &lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int n) &lt;br /&gt;
    {&lt;br /&gt;
        /* Dĺžka podpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
&lt;br /&gt;
        /* Začiatočný index ľavého podpoľa, ktoré má byť zlúčené */&lt;br /&gt;
&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia podpolia veľkosti 1 do podpolí veľkosti 2,&lt;br /&gt;
        * potom podpolia veľkosti 2 do podpolí veľkosti 4 a tak ďalej &lt;br /&gt;
        */&lt;br /&gt;
&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) &lt;br /&gt;
        {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych podpolí aktuálnej dĺžky podpoľa */&lt;br /&gt;
&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) &lt;br /&gt;
            {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého podpoľa, stred+1 je začiatočný prvok pravého podpoľa */&lt;br /&gt;
&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči podpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia na výpis poľa dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia poľa */&lt;br /&gt;
&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
&lt;br /&gt;
        # Nájdenie stredu poľa&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka poľa sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie poľa na dve časti&lt;br /&gt;
&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti poľa, potom druhej&lt;br /&gt;
&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného poľa&lt;br /&gt;
&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného poľa jednoducho skopírujú&lt;br /&gt;
&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
&lt;br /&gt;
    # Dĺžka podpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje podpolia aktuálnej dĺžky&lt;br /&gt;
&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie podpolí do jedného podpoľa&lt;br /&gt;
&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku podpoľa pripočítame aktuálnu&lt;br /&gt;
            # dĺžku podpolí a odčítame 1&lt;br /&gt;
&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka poľa - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžka poľa - 1&lt;br /&gt;
&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného poľa&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13070</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13070"/>
		<updated>2021-03-29T16:22:35Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Merge a MergeSort v rôznych programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov ''p = [1, 3, 5, 2, 4, 6]'', ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia ''L = [1, 3, 5]'' a ''P = [2, 4, 6]''. Všetky polia indexujeme od ''0'', pričom pre pole ''p'' používame index ''k'', pre ''L'' index ''i'' a pre ''P'' index ''j''. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus ''Merge'' tvorí kľúčovú časť triediaceho algoritmu ''MergeSort''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia ''L'' a ''P'' a do každého z nich skopírujeme obsah jednej polovice (''L'' - ľavá polovica, ''P'' - pravá polovica). Potom súčasne prechádzame polia ''L'' a ''P'' od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa ''L'' s prvkom v poli ''P''. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí ''P'' a ''L''. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia ''Merge'' má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==MergeSort==&lt;br /&gt;
''MergeSort'' je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí menšie časti, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to ''rekurzívnu'' a ''iteračnú''.&lt;br /&gt;
&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus ''MergeSort'' vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min -&amp;gt; max) utriediť vstupné pole. Určíme si ''stred'' poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (''začiatok ... stred ; stred + 1 ... koniec'') až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu ''Merge'' do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort IT.png|400px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus ''MergeSort'' vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... ''dlzka - 1'') a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu ''Merge'', ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme ''pole'', ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak ''N'' nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad ''pole'', čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_podpola = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_podpola &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_podpola - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_podpola - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_podpola - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_podpola&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_podpole *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * podpole1 [ľavý ... stred]&lt;br /&gt;
     * podpole2 [stred + 1 ... pravý] &lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpolí nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do poľa,&lt;br /&gt;
         * tak sa do poľa jednoducho skopírujú &lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred poľa&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu poľa samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného poľa&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis poľa dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia &lt;br /&gt;
{&lt;br /&gt;
    /* Zlúči 2 podpolia, ktoré sa vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * podpole1 [ľavý..stred]&lt;br /&gt;
     * podpole2 [stred+1..pravý] &lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j])&lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom z podpolí sa nachádzajú prvky, ktoré neboli zlúčené do poľa,&lt;br /&gt;
         * tak sa do poľa jednoducho skopírujú &lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int n) &lt;br /&gt;
    {&lt;br /&gt;
        /* Dĺžka podpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
&lt;br /&gt;
        /* Začiatočný index ľavého podpoľa, ktoré má byť zlúčené */&lt;br /&gt;
&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia podpolia veľkosti 1 do podpolí veľkosti 2,&lt;br /&gt;
        * potom podpolia veľkosti 2 do podpolí veľkosti 4 a tak ďalej &lt;br /&gt;
        */&lt;br /&gt;
&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) &lt;br /&gt;
        {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych podpolí aktuálnej dĺžky podpoľa */&lt;br /&gt;
&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) &lt;br /&gt;
            {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého podpoľa, stred+1 je začiatočný prvok pravého podpoľa */&lt;br /&gt;
&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči podpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia na výpis poľa dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia poľa */&lt;br /&gt;
&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
&lt;br /&gt;
        # Nájdenie stredu poľa&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka poľa sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie poľa na dve časti&lt;br /&gt;
&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti poľa, potom druhej&lt;br /&gt;
&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného poľa&lt;br /&gt;
&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného poľa jednoducho skopírujú&lt;br /&gt;
&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
&lt;br /&gt;
    # Dĺžka podpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje podpolia aktuálnej dĺžky&lt;br /&gt;
&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie podpolí do jedného podpoľa&lt;br /&gt;
&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku podpoľa pripočítame aktuálnu&lt;br /&gt;
            # dĺžku podpolí a odčítame 1&lt;br /&gt;
&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka poľa - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžka poľa - 1&lt;br /&gt;
&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného poľa&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13069</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13069"/>
		<updated>2021-03-29T15:42:42Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Merge a MergeSort v rôznych programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov ''p = [1, 3, 5, 2, 4, 6]'', ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia ''L = [1, 3, 5]'' a ''P = [2, 4, 6]''. Všetky polia indexujeme od ''0'', pričom pre pole ''p'' používame index ''k'', pre ''L'' index ''i'' a pre ''P'' index ''j''. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus ''Merge'' tvorí kľúčovú časť triediaceho algoritmu ''MergeSort''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia ''L'' a ''P'' a do každého z nich skopírujeme obsah jednej polovice (''L'' - ľavá polovica, ''P'' - pravá polovica). Potom súčasne prechádzame polia ''L'' a ''P'' od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa ''L'' s prvkom v poli ''P''. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí ''P'' a ''L''. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia ''Merge'' má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==MergeSort==&lt;br /&gt;
''MergeSort'' je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí menšie časti, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to ''rekurzívnu'' a ''iteračnú''.&lt;br /&gt;
&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus ''MergeSort'' vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min -&amp;gt; max) utriediť vstupné pole. Určíme si ''stred'' poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (''začiatok ... stred ; stred + 1 ... koniec'') až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu ''Merge'' do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort IT.png|400px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus ''MergeSort'' vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... ''dlzka - 1'') a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu ''Merge'', ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme ''pole'', ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak ''N'' nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad ''pole'', čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_podpola = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_podpola &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_podpola - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_podpola - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_podpola - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_podpola&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_podpole *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort &amp;lt;/br&amp;gt;v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * podpole1 [ľavý ... stred]&lt;br /&gt;
     * podpole2 [stred + 1 ... pravý] &lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpolí nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do poľa,&lt;br /&gt;
         * tak sa do poľa jednoducho skopírujú &lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred poľa&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu poľa samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného poľa&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis poľa dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia &lt;br /&gt;
{&lt;br /&gt;
    /* Zlúči 2 podpolia, ktoré sa vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * podpole1 [ľavý..stred]&lt;br /&gt;
     * podpole2 [stred+1..pravý] &lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j])&lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom z podpolí sa nachádzajú prvky, ktoré neboli zlúčené do poľa,&lt;br /&gt;
         * tak sa do poľa jednoducho skopírujú &lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int n) &lt;br /&gt;
    {&lt;br /&gt;
        /* Dĺžka podpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
&lt;br /&gt;
        /* Začiatočný index ľavého podpoľa, ktoré má byť zlúčené */&lt;br /&gt;
&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia podpolia veľkosti 1 do podpolí veľkosti 2,&lt;br /&gt;
        * potom podpolia veľkosti 2 do podpolí veľkosti 4 a tak ďalej &lt;br /&gt;
        */&lt;br /&gt;
&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) &lt;br /&gt;
        {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych podpolí aktuálnej dĺžky podpoľa */&lt;br /&gt;
&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) &lt;br /&gt;
            {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého podpoľa, stred+1 je začiatočný prvok pravého podpoľa */&lt;br /&gt;
&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči podpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia na výpis poľa dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia poľa */&lt;br /&gt;
&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
&lt;br /&gt;
        # Nájdenie stredu poľa&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka poľa sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie poľa na dve časti&lt;br /&gt;
&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti poľa, potom druhej&lt;br /&gt;
&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného poľa&lt;br /&gt;
&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného poľa jednoducho skopírujú&lt;br /&gt;
&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
&lt;br /&gt;
    # Dĺžka podpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje podpolia aktuálnej dĺžky&lt;br /&gt;
&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie podpolí do jedného podpoľa&lt;br /&gt;
&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku podpoľa pripočítame aktuálnu&lt;br /&gt;
            # dĺžku podpolí a odčítame 1&lt;br /&gt;
&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka poľa - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžka poľa - 1&lt;br /&gt;
&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného poľa&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13068</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13068"/>
		<updated>2021-03-29T15:21:28Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov ''p = [1, 3, 5, 2, 4, 6]'', ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia ''L = [1, 3, 5]'' a ''P = [2, 4, 6]''. Všetky polia indexujeme od ''0'', pričom pre pole ''p'' používame index ''k'', pre ''L'' index ''i'' a pre ''P'' index ''j''. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus ''Merge'' tvorí kľúčovú časť triediaceho algoritmu ''MergeSort''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia ''L'' a ''P'' a do každého z nich skopírujeme obsah jednej polovice (''L'' - ľavá polovica, ''P'' - pravá polovica). Potom súčasne prechádzame polia ''L'' a ''P'' od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa ''L'' s prvkom v poli ''P''. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí ''P'' a ''L''. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia ''Merge'' má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==MergeSort==&lt;br /&gt;
''MergeSort'' je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí menšie časti, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to ''rekurzívnu'' a ''iteračnú''.&lt;br /&gt;
&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus ''MergeSort'' vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min -&amp;gt; max) utriediť vstupné pole. Určíme si ''stred'' poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (''začiatok ... stred ; stred + 1 ... koniec'') až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu ''Merge'' do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort IT.png|400px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus ''MergeSort'' vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... ''dlzka - 1'') a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu ''Merge'', ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme ''pole'', ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak ''N'' nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad ''pole'', čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_podpola = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_podpola &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_podpola - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_podpola - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_podpola - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_podpola&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_podpole *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort &amp;lt;/br&amp;gt;v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * subpole1 [ľavý ... stred]&lt;br /&gt;
     * subpole2 [stred + 1 ... pravý] &lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpoli nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú &lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred pola&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia &lt;br /&gt;
{&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] &lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j])&lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú &lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int n) &lt;br /&gt;
    {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej &lt;br /&gt;
        */&lt;br /&gt;
&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) &lt;br /&gt;
        {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) &lt;br /&gt;
            {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
&lt;br /&gt;
    # Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje subpolia aktuálnej dĺžky&lt;br /&gt;
&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie subpoli do jedného subpola&lt;br /&gt;
&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku subpola pripočítame aktuálnu&lt;br /&gt;
            # dĺžku subpolí a odčítame 1&lt;br /&gt;
&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka pola - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžke pola - 1&lt;br /&gt;
&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13066</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13066"/>
		<updated>2021-03-29T15:05:47Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Merge a MergeSort v rôznych programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov ''p = [1, 3, 5, 2, 4, 6]'', ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia ''L = [1, 3, 5]'' a ''P = [2, 4, 6]''. Všetky polia indexujeme od ''0'', pričom pre pole ''p'' používame index ''k'', pre ''L'' index ''i'' a pre ''P'' index ''j''. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus ''Merge'' tvorí kľúčovú časť triediaceho algoritmu ''MergeSort''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia ''L'' a ''P'' a do každého z nich skopírujeme obsah jednej polovice (''L'' - ľavá polovica, ''P'' - pravá polovica). Potom súčasne prechádzame polia ''L'' a ''P'' od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa ''L'' s prvkom v poli ''P''. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí ''P'' a ''L''. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia ''Merge'' má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==MergeSort==&lt;br /&gt;
''MergeSort'' je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to ''rekurzívnu'' a ''iteračnú''.&lt;br /&gt;
&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus ''MergeSort'' vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min -&amp;gt; max) utriediť vstupné pole. Určíme si ''stred'' poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (''začiatok ... stred ; stred + 1 ... koniec'') až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu ''Merge'' do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort IT.png|400px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus ''MergeSort'' vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... ''dlzka - 1'') a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu ''Merge'', ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme ''pole'', ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak ''N'' nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad ''pole'', čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort &amp;lt;/br&amp;gt;v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * subpole1 [ľavý ... stred]&lt;br /&gt;
     * subpole2 [stred + 1 ... pravý] &lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpoli nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú &lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred pola&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia &lt;br /&gt;
{&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] &lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j])&lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú &lt;br /&gt;
         */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int n) &lt;br /&gt;
    {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej &lt;br /&gt;
        */&lt;br /&gt;
&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) &lt;br /&gt;
        {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) &lt;br /&gt;
            {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
&lt;br /&gt;
    # Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje subpolia aktuálnej dĺžky&lt;br /&gt;
&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie subpoli do jedného subpola&lt;br /&gt;
&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku subpola pripočítame aktuálnu&lt;br /&gt;
            # dĺžku subpolí a odčítame 1&lt;br /&gt;
&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka pola - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžke pola - 1&lt;br /&gt;
&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13065</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13065"/>
		<updated>2021-03-29T14:55:47Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Merge sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov ''p = [1, 3, 5, 2, 4, 6]'', ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia ''L = [1, 3, 5]'' a ''P = [2, 4, 6]''. Všetky polia indexujeme od ''0'', pričom pre pole ''p'' používame index ''k'', pre ''L'' index ''i'' a pre ''P'' index ''j''. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus ''Merge'' tvorí kľúčovú časť triediaceho algoritmu ''MergeSort''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia ''L'' a ''P'' a do každého z nich skopírujeme obsah jednej polovice (''L'' - ľavá polovica, ''P'' - pravá polovica). Potom súčasne prechádzame polia ''L'' a ''P'' od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa ''L'' s prvkom v poli ''P''. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí ''P'' a ''L''. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia ''Merge'' má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==MergeSort==&lt;br /&gt;
''MergeSort'' je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to ''rekurzívnu'' a ''iteračnú''.&lt;br /&gt;
&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus ''MergeSort'' vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min -&amp;gt; max) utriediť vstupné pole. Určíme si ''stred'' poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (''začiatok ... stred ; stred + 1 ... koniec'') až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu ''Merge'' do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort IT.png|400px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus ''MergeSort'' vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie ''Merge''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... ''dlzka - 1'') a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu ''Merge'', ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme ''pole'', ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak ''N'' nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad ''pole'', čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia ''MergeSort'' nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort &amp;lt;/br&amp;gt;v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * subpole1 [ľavý ... stred]&lt;br /&gt;
     * subpole2 [stred + 1 ... pravý] */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpoli nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred pola&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
    # Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje subpolia aktuálnej dĺžky&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie subpoli do jedného subpola&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku subpola pripočítame aktuálnu&lt;br /&gt;
            # dĺžku subpolí a odčítame 1&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka pola - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžke pola - 1&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13064</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13064"/>
		<updated>2021-03-29T14:51:00Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Pseudokód */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov ''p = [1, 3, 5, 2, 4, 6]'', ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia ''L = [1, 3, 5]'' a ''P = [2, 4, 6]''. Všetky polia indexujeme od ''0'', pričom pre pole ''p'' používame index ''k'', pre ''L'' index ''i'' a pre ''P'' index ''j''. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus ''Merge'' tvorí kľúčovú časť triediaceho algoritmu ''MergeSort''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia ''L'' a ''P'' a do každého z nich skopírujeme obsah jednej polovice (''L'' - ľavá polovica, ''P'' - pravá polovica). Potom súčasne prechádzame polia ''L'' a ''P'' od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa ''L'' s prvkom v poli ''P''. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí ''P'' a ''L''. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia ''Merge'' má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min -&amp;gt; max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (''začiatok ... stred ; stred + 1 ... koniec'') až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu ''Merge'' do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort IT.png|400px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort &amp;lt;/br&amp;gt;v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * subpole1 [ľavý ... stred]&lt;br /&gt;
     * subpole2 [stred + 1 ... pravý] */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpoli nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred pola&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
    # Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje subpolia aktuálnej dĺžky&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie subpoli do jedného subpola&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku subpola pripočítame aktuálnu&lt;br /&gt;
            # dĺžku subpolí a odčítame 1&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka pola - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžke pola - 1&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13063</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13063"/>
		<updated>2021-03-29T14:50:33Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Zlučovací algoritmus Merge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov ''p = [1, 3, 5, 2, 4, 6]'', ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia ''L = [1, 3, 5]'' a ''P = [2, 4, 6]''. Všetky polia indexujeme od ''0'', pričom pre pole ''p'' používame index ''k'', pre ''L'' index ''i'' a pre ''P'' index ''j''. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus ''Merge'' tvorí kľúčovú časť triediaceho algoritmu ''MergeSort''.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia ''L'' a ''P'' a do každého z nich skopírujeme obsah jednej polovice (''L'' - ľavá polovica, ''P'' - pravá polovica). Potom súčasne prechádzame polia ''L'' a ''P'' od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa ''L'' s prvkom v poli ''P''. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí ''P'' a ''L''. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min -&amp;gt; max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (''začiatok ... stred ; stred + 1 ... koniec'') až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu ''Merge'' do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort IT.png|400px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort &amp;lt;/br&amp;gt;v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * subpole1 [ľavý ... stred]&lt;br /&gt;
     * subpole2 [stred + 1 ... pravý] */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpoli nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred pola&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
    # Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje subpolia aktuálnej dĺžky&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie subpoli do jedného subpola&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku subpola pripočítame aktuálnu&lt;br /&gt;
            # dĺžku subpolí a odčítame 1&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka pola - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžke pola - 1&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13061</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13061"/>
		<updated>2021-03-29T14:40:05Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov ''p = [1, 3, 5, 2, 4, 6]'', ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia ''L = [1, 3, 5]'' a ''P = [2, 4, 6]''. Všetky polia indexujeme od ''0'', pričom pre pole ''p'' používame index ''k'', pre ''L'' index ''i'' a pre ''P'' index ''j''. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia ''L'' a ''P'' a do každého z nich skopírujeme obsah jednej polovice (''L'' - ľavá polovica, ''P'' - pravá polovica). Potom súčasne prechádzame polia ''L'' a ''P'' od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa ''L'' s prvkom v poli ''P''. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí ''P'' a ''L''. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min -&amp;gt; max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (''začiatok ... stred ; stred + 1 ... koniec'') až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu ''Merge'' do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort IT.png|400px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort &amp;lt;/br&amp;gt;v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * subpole1 [ľavý ... stred]&lt;br /&gt;
     * subpole2 [stred + 1 ... pravý] */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpoli nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred pola&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
    # Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje subpolia aktuálnej dĺžky&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie subpoli do jedného subpola&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku subpola pripočítame aktuálnu&lt;br /&gt;
            # dĺžku subpolí a odčítame 1&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka pola - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžke pola - 1&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13060</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13060"/>
		<updated>2021-03-29T11:18:16Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Vlastnosti algoritmu Merge Sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov ''p = [1, 3, 5, 2, 4, 6]'', ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia ''L = [1, 3, 5]'' a ''P = [2, 4, 6]''. Všetky polia indexujeme od ''0'', pričom pre pole ''p'' používame index ''k'', pre ''L'' index ''i'' a pre ''P'' index ''j''. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia ''L'' a ''P'' a do každého z nich skopírujeme obsah jednej polovice (''L'' - ľavá polovica, ''P'' - pravá polovica). Potom súčasne prechádzame polia ''L'' a ''P'' od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa ''L'' s prvkom v poli ''P''. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí ''P'' a ''L''. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort IT.png|400px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort &amp;lt;/br&amp;gt;v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * subpole1 [ľavý ... stred]&lt;br /&gt;
     * subpole2 [stred + 1 ... pravý] */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpoli nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred pola&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
    # Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje subpolia aktuálnej dĺžky&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie subpoli do jedného subpola&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku subpola pripočítame aktuálnu&lt;br /&gt;
            # dĺžku subpolí a odčítame 1&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka pola - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžke pola - 1&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13059</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13059"/>
		<updated>2021-03-29T11:17:30Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Vlastnosti algoritmu */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov ''p = [1, 3, 5, 2, 4, 6]'', ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia ''L = [1, 3, 5]'' a ''P = [2, 4, 6]''. Všetky polia indexujeme od ''0'', pričom pre pole ''p'' používame index ''k'', pre ''L'' index ''i'' a pre ''P'' index ''j''. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia ''L'' a ''P'' a do každého z nich skopírujeme obsah jednej polovice (''L'' - ľavá polovica, ''P'' - pravá polovica). Potom súčasne prechádzame polia ''L'' a ''P'' od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa ''L'' s prvkom v poli ''P''. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí ''P'' a ''L''. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri lineárnom zozname netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort IT.png|400px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort &amp;lt;/br&amp;gt;v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * subpole1 [ľavý ... stred]&lt;br /&gt;
     * subpole2 [stred + 1 ... pravý] */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpoli nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred pola&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
    # Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje subpolia aktuálnej dĺžky&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie subpoli do jedného subpola&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku subpola pripočítame aktuálnu&lt;br /&gt;
            # dĺžku subpolí a odčítame 1&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka pola - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžke pola - 1&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13058</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13058"/>
		<updated>2021-03-29T11:10:21Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Zlučovací algoritmus Merge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov ''p = [1, 3, 5, 2, 4, 6]'', ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia ''L = [1, 3, 5]'' a ''P = [2, 4, 6]''. Všetky polia indexujeme od ''0'', pričom pre pole ''p'' používame index ''k'', pre ''L'' index ''i'' a pre ''P'' index ''j''. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia ''L'' a ''P'' a do každého z nich skopírujeme obsah jednej polovice (''L'' - ľavá polovica, ''P'' - pravá polovica). Potom súčasne prechádzame polia ''L'' a ''P'' od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa ''L'' s prvkom v poli ''P''. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí ''P'' a ''L''. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort IT.png|400px|náhľad|vpravo]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort &amp;lt;/br&amp;gt;v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * subpole1 [ľavý ... stred]&lt;br /&gt;
     * subpole2 [stred + 1 ... pravý] */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpoli nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred pola&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
    # Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje subpolia aktuálnej dĺžky&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie subpoli do jedného subpola&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku subpola pripočítame aktuálnu&lt;br /&gt;
            # dĺžku subpolí a odčítame 1&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka pola - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžke pola - 1&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13054</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13054"/>
		<updated>2021-03-29T10:18:22Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Merge a MergeSortv rôznych programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort &amp;lt;/br&amp;gt;v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * subpole1 [ľavý ... stred]&lt;br /&gt;
     * subpole2 [stred + 1 ... pravý] */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpoli nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred pola&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
    # Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje subpolia aktuálnej dĺžky&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie subpoli do jedného subpola&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku subpola pripočítame aktuálnu&lt;br /&gt;
            # dĺžku subpolí a odčítame 1&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka pola - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžke pola - 1&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13053</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13053"/>
		<updated>2021-03-29T10:17:53Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Merge a MergeSort programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort&amp;lt;/br&amp;gt;v rôznych programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * subpole1 [ľavý ... stred]&lt;br /&gt;
     * subpole2 [stred + 1 ... pravý] */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpoli nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred pola&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
    # Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje subpolia aktuálnej dĺžky&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie subpoli do jedného subpola&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku subpola pripočítame aktuálnu&lt;br /&gt;
            # dĺžku subpolí a odčítame 1&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka pola - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžke pola - 1&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13052</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13052"/>
		<updated>2021-03-29T10:15:28Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Merge a MergeSort programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * subpole1 [ľavý ... stred]&lt;br /&gt;
     * subpole2 [stred + 1 ... pravý] */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpoli nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred pola&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort_iteracia(pole):&lt;br /&gt;
    # Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt;&lt;br /&gt;
    aktual_dlzka = 1&lt;br /&gt;
&lt;br /&gt;
    # Vonkajší cyklus, ktorý určuje subpolia aktuálnej dĺžky&lt;br /&gt;
    while aktual_dlzka &amp;lt; len(pole) - 1:&lt;br /&gt;
        lavy = 0&lt;br /&gt;
&lt;br /&gt;
        # Vnútorný cyklus, ktorý slúži na zlúčenie a zoradenie subpoli do jedného subpola&lt;br /&gt;
        while lavy &amp;lt; len(pole) - 1:&lt;br /&gt;
            # Index stredného prvku sa určí, keď k indexu ľavého prvku subpola pripočítame aktuálnu&lt;br /&gt;
            # dĺžku subpolí a odčítame 1&lt;br /&gt;
            stred = min((lavy + aktual_dlzka - 1), len(pole) - 1)&lt;br /&gt;
&lt;br /&gt;
            # Ak platí podmienka 2 * aktuálna dĺžka &amp;lt; dĺžka pola - 1, tak pravý index = aktuálnej dĺžke subpolí,&lt;br /&gt;
            # inak pravý index = dĺžke pola - 1&lt;br /&gt;
            pravy = ((2 * aktual_dlzka + lavy - 1, len(pole) - 1)[2 * aktual_dlzka + lavy - 1 &amp;gt; len(pole) - 1])&lt;br /&gt;
&lt;br /&gt;
            # Volanie funkcie merge&lt;br /&gt;
            merge(pole, lavy, stred, pravy)&lt;br /&gt;
&lt;br /&gt;
            lavy = lavy + 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
        # Aktuálna dĺžka sa sa zmení na dvojnásobok jej predošlej hodnoty&lt;br /&gt;
        aktual_dlzka = 2 * aktual_dlzka&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge(pole, lavy, stred, pravy):&lt;br /&gt;
    n1 = stred - lavy + 1&lt;br /&gt;
    n2 = pravy - stred&lt;br /&gt;
&lt;br /&gt;
    # Inicializácia pomocných polí&lt;br /&gt;
    L = [0] * n1&lt;br /&gt;
    P = [0] * n2&lt;br /&gt;
&lt;br /&gt;
    # Načítanie dát do pomocných polí&lt;br /&gt;
    for i in range(0, n1):&lt;br /&gt;
        L[i] = pole[lavy + i]&lt;br /&gt;
    for i in range(0, n2):&lt;br /&gt;
        P[i] = pole[stred + i + 1]&lt;br /&gt;
&lt;br /&gt;
    i, j, k = 0, 0, lavy&lt;br /&gt;
&lt;br /&gt;
    # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
    while i &amp;lt; n1 and j &amp;lt; n2:&lt;br /&gt;
        if L[i] &amp;gt; P[j]:&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
    # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
    while i &amp;lt; n1:&lt;br /&gt;
        pole[k] = L[i]&lt;br /&gt;
        i += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
    while j &amp;lt; n2:&lt;br /&gt;
        pole[k] = P[j]&lt;br /&gt;
        j += 1&lt;br /&gt;
        k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort_iteracia(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13050</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13050"/>
		<updated>2021-03-29T09:54:48Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Merge a MergeSort programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * subpole1 [ľavý ... stred]&lt;br /&gt;
     * subpole2 [stred + 1 ... pravý] */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpoli nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred pola&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Zlúčenie a zoradenie údajov z pomocných polí do jedného pola&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13049</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13049"/>
		<updated>2021-03-29T09:49:58Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Merge a MergeSort programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * subpole1 [ľavý ... stred]&lt;br /&gt;
     * subpole2 [stred + 1 ... pravý] */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpoli nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred pola&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Načítanie dát do pomocných polí L[] a P[]&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13048</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13048"/>
		<updated>2021-03-29T09:49:17Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Implementácia algoritmov Merge a MergeSort programovacích jazykoch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
===Opis rekurzívnej a iteračnej verzie algoritmu Merge Sort===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort programovacích jazykoch==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C &amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort &lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia zlúči 2 podpolia, ktoré sme vytvorili z pôvodného poľa.&lt;br /&gt;
     * Každé podpole má polovičnú dĺžku pôvodného poľa.&lt;br /&gt;
     * subpole1 [ľavý ... stred]&lt;br /&gt;
     * subpole2 [stred + 1 ... pravý] */&lt;br /&gt;
&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
&lt;br /&gt;
        // Výpočet dĺžky 2 podpolí&lt;br /&gt;
&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého podpoľa&lt;br /&gt;
&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
&lt;br /&gt;
        // Počiatočný index zlúčeného podpoľa&lt;br /&gt;
&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2)&lt;br /&gt;
        {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že sa v jednom zo podpoli nachádzajú ešte nejaké prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
&lt;br /&gt;
        while (i &amp;lt; n1) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) &lt;br /&gt;
        {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) &lt;br /&gt;
    {&lt;br /&gt;
        if (lavy &amp;lt; pravy) &lt;br /&gt;
        {&lt;br /&gt;
            // Musíme nájsť stred pola&lt;br /&gt;
&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main&lt;br /&gt;
{&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
&lt;br /&gt;
    static void vypis_pole(int[] pole) &lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        for (int j : pole) &lt;br /&gt;
        {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) &lt;br /&gt;
    {&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná: Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna: Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Načítanie dát do pomocných polí L[] a P[]&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    print(pole, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13032</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13032"/>
		<updated>2021-03-28T16:41:41Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Iteračná verzia algoritmov */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort==&lt;br /&gt;
===Rekurzívna verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
    * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
    * subpole1 [ľavý..stred]&lt;br /&gt;
    * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
        * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) {&lt;br /&gt;
        if (lavy &amp;lt; pravy) {&lt;br /&gt;
            //Musíme nájsť stred pola&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
            System.out.print(pole[i] + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Načítanie dát do pomocných polí L[] a P[]&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Kód na výpis pola&lt;br /&gt;
def vypis_pole(pole):&lt;br /&gt;
    for i in range(len(pole)):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Iteračná verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole, pole.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13031</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13031"/>
		<updated>2021-03-28T16:34:48Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Iteračná verzia algoritmov */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie.&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli.&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort==&lt;br /&gt;
===Rekurzívna verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
    * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
    * subpole1 [ľavý..stred]&lt;br /&gt;
    * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
        * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) {&lt;br /&gt;
        if (lavy &amp;lt; pravy) {&lt;br /&gt;
            //Musíme nájsť stred pola&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
            System.out.print(pole[i] + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Načítanie dát do pomocných polí L[] a P[]&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Kód na výpis pola&lt;br /&gt;
def vypis_pole(pole):&lt;br /&gt;
    for i in range(len(pole)):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Iteračná verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na načítanie pola dĺžky n */&lt;br /&gt;
    static void nacitaj_pole(int[] pole) {&lt;br /&gt;
        Random rand = new Random();&lt;br /&gt;
&lt;br /&gt;
        int min = -100000;&lt;br /&gt;
        int max = 100000;&lt;br /&gt;
&lt;br /&gt;
        /* Naplnenie pola náhodnými číslami */&lt;br /&gt;
        for (int i = 0; i &amp;lt; pole.length; i++) {&lt;br /&gt;
            //pole[i] = rand.nextInt(pole.length);&lt;br /&gt;
            pole[i] = (int)(Math.random() * (max - min + 1) + min);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    static boolean kontrola(int[] pole) {&lt;br /&gt;
        /* Premenná, pomocou ktorej zistíme či je pole zoradené */&lt;br /&gt;
        boolean sorted = false;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; Math.pow(10, 6) - 1; i++) {&lt;br /&gt;
            if (pole[i] &amp;lt;= pole[i + 1])&lt;br /&gt;
                sorted = true;&lt;br /&gt;
&lt;br /&gt;
            else {&lt;br /&gt;
                sorted = false;&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return sorted;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole_parne = new int[1000000];&lt;br /&gt;
        int[] pole_neparne = new int[1000001];&lt;br /&gt;
&lt;br /&gt;
        nacitaj_pole(pole_parne);&lt;br /&gt;
        nacitaj_pole(pole_neparne);&lt;br /&gt;
&lt;br /&gt;
        /*System.out.println(&amp;quot;Zadané polia:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole_parne);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        vypis_pole(pole_neparne);&lt;br /&gt;
        System.out.println();*/&lt;br /&gt;
&lt;br /&gt;
        /*MergeSort_rekurzia ms_re = new MergeSort_rekurzia();&lt;br /&gt;
        ms_re.sort(pole_parne, 0, pole_parne.length - 1);&lt;br /&gt;
        ms_re.sort(pole_neparne, 0, pole_neparne.length - 1);*/&lt;br /&gt;
&lt;br /&gt;
        /*System.out.println(&amp;quot;Zoradené polia:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole_parne);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        vypis_pole(pole_neparne);&lt;br /&gt;
        System.out.println();*/&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole_parne, pole_parne.length);&lt;br /&gt;
        ms_it.sort(pole_neparne, pole_neparne.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Je pole_parne zoradene? &amp;quot; + kontrola(pole_parne));&lt;br /&gt;
        System.out.println(&amp;quot;Je pole_neparne zoradene? &amp;quot; + kontrola(pole_neparne));&lt;br /&gt;
    }&lt;br /&gt;
}class MergeSort_iteracia {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
     * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
     * subpole1 [ľavý..stred]&lt;br /&gt;
     * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
         * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int n) {&lt;br /&gt;
        /* Dĺžka subpolí, ktoré majú byť zlúčené, hodnoty premennej sa pohybujú v intervale &amp;lt;1;n-1&amp;gt; */&lt;br /&gt;
        int aktual_dlzka;&lt;br /&gt;
        /* Začiatočný index ľavého subpola, ktoré má byť zlúčené */&lt;br /&gt;
        int zaciatok_vlavo;&lt;br /&gt;
&lt;br /&gt;
        /* Vzostupné usporiadanie prvkov. Najskôr sa zlúčia subpolia veľkosti 1 do subpolí veľkosti 2,&lt;br /&gt;
        * potom subpolia veľkosti 2 do subpolí veľkosti 4 a tak ďalej */&lt;br /&gt;
        for (aktual_dlzka = 1; aktual_dlzka &amp;lt;= n - 1; aktual_dlzka *= 2) {&lt;br /&gt;
            /* Určenie začiatočného prvku rôznych subpolí aktuálnej dĺžky subpola */&lt;br /&gt;
            for (zaciatok_vlavo = 0; zaciatok_vlavo &amp;lt; n - 1; zaciatok_vlavo += 2 * aktual_dlzka) {&lt;br /&gt;
                /* Nájdenie konečného prvku ľavého subpola, stred+1 je začiatočný prvok pravého subpola */&lt;br /&gt;
                int stred = Math.min(zaciatok_vlavo + aktual_dlzka - 1, n - 1);&lt;br /&gt;
                int koniec_vpravo = Math.min(zaciatok_vlavo + 2 * aktual_dlzka - 1, n - 1);&lt;br /&gt;
&lt;br /&gt;
                /* Zlúči subpolia L[zaciatok_vlavo .. stred] &amp;amp; P[stred+1 .. koniec_vpravo] */&lt;br /&gt;
                merge(pole, zaciatok_vlavo, stred, koniec_vpravo);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na načítanie pola dĺžky n */&lt;br /&gt;
    static void nacitaj_pole(int[] pole) {&lt;br /&gt;
        Random rand = new Random();&lt;br /&gt;
&lt;br /&gt;
        int min = -100000;&lt;br /&gt;
        int max = 100000;&lt;br /&gt;
&lt;br /&gt;
        /* Naplnenie pola náhodnými číslami */&lt;br /&gt;
        for (int i = 0; i &amp;lt; pole.length; i++) {&lt;br /&gt;
            //pole[i] = rand.nextInt(pole.length);&lt;br /&gt;
            pole[i] = (int)(Math.random() * (max - min + 1) + min);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int j : pole) {&lt;br /&gt;
            System.out.print(j + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    static boolean kontrola(int[] pole) {&lt;br /&gt;
        /* Premenná, pomocou ktorej zistíme či je pole zoradené */&lt;br /&gt;
        boolean sorted = false;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; Math.pow(10, 6) - 1; i++) {&lt;br /&gt;
            if (pole[i] &amp;lt;= pole[i + 1])&lt;br /&gt;
                sorted = true;&lt;br /&gt;
&lt;br /&gt;
            else {&lt;br /&gt;
                sorted = false;&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return sorted;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /* Inicializácia pola */&lt;br /&gt;
        int[] pole_parne = new int[1000000];&lt;br /&gt;
        int[] pole_neparne = new int[1000001];&lt;br /&gt;
&lt;br /&gt;
        nacitaj_pole(pole_parne);&lt;br /&gt;
        nacitaj_pole(pole_neparne);&lt;br /&gt;
&lt;br /&gt;
        /*System.out.println(&amp;quot;Zadané polia:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole_parne);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        vypis_pole(pole_neparne);&lt;br /&gt;
        System.out.println();*/&lt;br /&gt;
&lt;br /&gt;
        /*MergeSort_rekurzia ms_re = new MergeSort_rekurzia();&lt;br /&gt;
        ms_re.sort(pole_parne, 0, pole_parne.length - 1);&lt;br /&gt;
        ms_re.sort(pole_neparne, 0, pole_neparne.length - 1);*/&lt;br /&gt;
&lt;br /&gt;
        /*System.out.println(&amp;quot;Zoradené polia:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole_parne);&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        vypis_pole(pole_neparne);&lt;br /&gt;
        System.out.println();*/&lt;br /&gt;
&lt;br /&gt;
        MergeSort_iteracia ms_it = new MergeSort_iteracia();&lt;br /&gt;
        ms_it.sort(pole_parne, pole_parne.length);&lt;br /&gt;
        ms_it.sort(pole_neparne, pole_neparne.length);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Je pole_parne zoradene? &amp;quot; + kontrola(pole_parne));&lt;br /&gt;
        System.out.println(&amp;quot;Je pole_neparne zoradene? &amp;quot; + kontrola(pole_neparne));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13025</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13025"/>
		<updated>2021-03-28T16:15:00Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Merge sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot;&amp;gt;&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|center|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot;&amp;gt;&lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Rekurzívna verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Iteračná verzia&amp;quot; block&amp;gt;&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort==&lt;br /&gt;
===Rekurzívna verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
    * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
    * subpole1 [ľavý..stred]&lt;br /&gt;
    * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
        * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) {&lt;br /&gt;
        if (lavy &amp;lt; pravy) {&lt;br /&gt;
            //Musíme nájsť stred pola&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
            System.out.print(pole[i] + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Načítanie dát do pomocných polí L[] a P[]&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Kód na výpis pola&lt;br /&gt;
def vypis_pole(pole):&lt;br /&gt;
    for i in range(len(pole)):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Iteračná verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13024</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13024"/>
		<updated>2021-03-28T15:56:34Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Merge sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort==&lt;br /&gt;
===Rekurzívna verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
    * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
    * subpole1 [ľavý..stred]&lt;br /&gt;
    * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
        * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) {&lt;br /&gt;
        if (lavy &amp;lt; pravy) {&lt;br /&gt;
            //Musíme nájsť stred pola&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
            System.out.print(pole[i] + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Načítanie dát do pomocných polí L[] a P[]&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Kód na výpis pola&lt;br /&gt;
def vypis_pole(pole):&lt;br /&gt;
    for i in range(len(pole)):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Iteračná verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13023</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13023"/>
		<updated>2021-03-28T15:56:04Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Merge sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort==&lt;br /&gt;
===Rekurzívna verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
    * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
    * subpole1 [ľavý..stred]&lt;br /&gt;
    * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
        * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) {&lt;br /&gt;
        if (lavy &amp;lt; pravy) {&lt;br /&gt;
            //Musíme nájsť stred pola&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
            System.out.print(pole[i] + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Načítanie dát do pomocných polí L[] a P[]&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Kód na výpis pola&lt;br /&gt;
def vypis_pole(pole):&lt;br /&gt;
    for i in range(len(pole)):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Iteračná verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = new int[L_dlzka];&lt;br /&gt;
    int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    delete []L;&lt;br /&gt;
    delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
            koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
            Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13021</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13021"/>
		<updated>2021-03-28T15:50:26Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Merge sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort==&lt;br /&gt;
===Rekurzívna verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
    * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
    * subpole1 [ľavý..stred]&lt;br /&gt;
    * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
        * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) {&lt;br /&gt;
        if (lavy &amp;lt; pravy) {&lt;br /&gt;
            //Musíme nájsť stred pola&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
            System.out.print(pole[i] + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Načítanie dát do pomocných polí L[] a P[]&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Kód na výpis pola&lt;br /&gt;
def vypis_pole(pole):&lt;br /&gt;
    for i in range(len(pole)):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Iteračná verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13020</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13020"/>
		<updated>2021-03-28T15:49:42Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Merge sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort==&lt;br /&gt;
===Rekurzívna verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
    * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
    * subpole1 [ľavý..stred]&lt;br /&gt;
    * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
        * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) {&lt;br /&gt;
        if (lavy &amp;lt; pravy) {&lt;br /&gt;
            //Musíme nájsť stred pola&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
            System.out.print(pole[i] + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Načítanie dát do pomocných polí L[] a P[]&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Kód na výpis pola&lt;br /&gt;
def vypis_pole(pole):&lt;br /&gt;
    for i in range(len(pole)):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Iteračná verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13019</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13019"/>
		<updated>2021-03-28T15:48:48Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Merge sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort==&lt;br /&gt;
===Rekurzívna verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
    * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
    * subpole1 [ľavý..stred]&lt;br /&gt;
    * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
        * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) {&lt;br /&gt;
        if (lavy &amp;lt; pravy) {&lt;br /&gt;
            //Musíme nájsť stred pola&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
            System.out.print(pole[i] + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Načítanie dát do pomocných polí L[] a P[]&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Kód na výpis pola&lt;br /&gt;
def vypis_pole(pole):&lt;br /&gt;
    for i in range(len(pole)):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Iteračná verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13018</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13018"/>
		<updated>2021-03-28T15:48:38Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Merge sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Slovný opis===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort==&lt;br /&gt;
===Rekurzívna verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
    * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
    * subpole1 [ľavý..stred]&lt;br /&gt;
    * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
        * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) {&lt;br /&gt;
        if (lavy &amp;lt; pravy) {&lt;br /&gt;
            //Musíme nájsť stred pola&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
            System.out.print(pole[i] + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Načítanie dát do pomocných polí L[] a P[]&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Kód na výpis pola&lt;br /&gt;
def vypis_pole(pole):&lt;br /&gt;
    for i in range(len(pole)):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Iteračná verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13017</id>
		<title>Triedenie zlučovaním</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13017"/>
		<updated>2021-03-28T15:47:57Z</updated>

		<summary type="html">&lt;p&gt;Filip Tomek: /* Merge sort */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategória:Algoritmy triedenia]]&lt;br /&gt;
{{Draft}}&lt;br /&gt;
{{Skripta programovanie}}&lt;br /&gt;
__TOC__&lt;br /&gt;
==TODO: Pseudokód treba opraviť, text refaktorovať, otestovať kódy, zvýrazniť veci v texte, opraviť preklepy, opraviť popis obrázkov, pridať nové odkazy==&lt;br /&gt;
&lt;br /&gt;
==Zlučovací algoritmus Merge==&lt;br /&gt;
&lt;br /&gt;
Princíp zlučovania tkvie v tom, že máme dva alebo viac utriedených zoznamov, ktoré skombinuje do jedného utriedeného zoznamu (výsledný zoznam musí obsahovať všetky prvky z pôvodných zoznamov). Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tomto článku sa zameriame na algoritmus pre dátovú štruktúru pole.&lt;br /&gt;
&lt;br /&gt;
Algoritmus Merge tvorí kľúčovú časť triediaceho algoritmu MergeSort.&lt;br /&gt;
&lt;br /&gt;
[[Súbor:Funkcia merge.png|500px|náhľad|vpravo|Vizualizácia funkcie Merge: Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vytvorí pomocné polia L = [1, 3, 5] a P = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre L index i a pre P index j. Postupnosť krokov je označená číslicami 1 až 6.  &lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
Nech máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Vytvoríme si dve pomocné polia L a P a do každého z nich skopírujeme obsah jednej polovice (L - ľavá polovica, P - pravá polovica). Potom súčasne prechádzame polia L a P od začiatku po koniec, pričom v každom cykle porovnáme prvok poľa L s prvkom v poli P. Z tejto dvojice následne vyberieme minimum, (keď triedime od najmenšieho po najväčší) ktoré vložíme na prvú voľnú pozíciu pôvodného poľa (na začiatku je to prvá pozícia poľa). Nakoniec zvýšime index pri vstupnom poli a pri pomocnom poli, z ktorého vyberáme daný prvok. Túto postupnosť krokov opakujeme, pokiaľ neprídeme na koniec jedného z polí P a L. Ak nastane situácia, že prídeme na koniec jedného z pomocných polí (a v druhom nám ostali ešte nejaké prvky), potom už iba naspäť skopírujeme zbytok druhého pomocného poľa na koniec pôvodného poľa. &lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie pomocných polí), &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ netreba alokovať dočasné polia, stačí iba presmerovať smerníky)&lt;br /&gt;
* využitie: kľúčový podprogram pre triediaci algoritmus MergeSort&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
Nech funkcia Merge má nasledovný prototyp: &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy ? Ak áno, skonči, inak pokračuj krokom 2.&amp;lt;/code&amp;gt;&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;i = 0, j = 0, k = lavy &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;dlzka_L = stred - lavy + 1, dlzka_P = pravy - stred&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Nech: &amp;lt;code&amp;gt; L = pole[lavy ... stred], P = pole[stred + 1 ... pravy] &amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; a zároveň &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 5.1., inak skoč na krok 6.&lt;br /&gt;
:::5.1. Je &amp;lt;code&amp;gt;L[i] &amp;lt;= P[j]&amp;lt;/code&amp;gt;? &lt;br /&gt;
:::: Ak áno:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:::: Ak nie:&lt;br /&gt;
:::::5.1.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::5.1.4. Skoč na krok 5.&lt;br /&gt;
:6. Je &amp;lt;code&amp;gt;i &amp;lt; dlzka_L&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 6.1., inak skoč na krok 7.&lt;br /&gt;
:::6.1. &amp;lt;code&amp;gt;pole[k] = L[i]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.3. &amp;lt;code&amp;gt;i += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::6.4. Skoč na krok 6.&lt;br /&gt;
:7. Je &amp;lt;code&amp;gt;j &amp;lt; dlzka_P&amp;lt;/code&amp;gt; ? Ak áno, pokračuj krokom 7.1., inak skonči.&lt;br /&gt;
:::7.1. &amp;lt;code&amp;gt;pole[k] = P[j]&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.2. &amp;lt;code&amp;gt;k += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.3. &amp;lt;code&amp;gt;j += 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::7.4. Skoč na krok 7.&lt;br /&gt;
&lt;br /&gt;
==Merge sort==&lt;br /&gt;
[[Súbor:Merge sort.png|400px|náhľad|vpravo|Vizualizácia rekurzívnej verzie algoritmu MergeSort]]&lt;br /&gt;
Merge Sort je triediaci algoritmus, ktorý využíva stratégiu '''&amp;quot;rozdeľuj a panuj&amp;quot;''', čo znamená, že vstupný zoznam najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Radí sa medzi najpoužívanejšie a najviac rešpektované triediace algoritmy. &lt;br /&gt;
&lt;br /&gt;
Z hľadiska implementácie môžeme vytvoriť dve základné verzie algoritmu, a to rekurzívnu a iteračnú.&lt;br /&gt;
&lt;br /&gt;
===Vlastnosti algoritmu Merge Sort===&lt;br /&gt;
* vhodný pre dátové štruktúry: pole, lineárny zoznam&lt;br /&gt;
* časová náročnosť: vždy linearitmická &amp;lt;math&amp;gt; O(n.log(n)) &amp;lt;/math&amp;gt;, vďaka ktorej dokáže efektívne triediť veľmi veľké zoznamy&lt;br /&gt;
* priestorová náročnosť: lineárna &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; pre pole (alokovanie dočasných polí), konštantná &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; pre lineárny zoznam (pri LZ stačí iba presmerovať smerníky)&lt;br /&gt;
* druh triedenia: triedenie zlučovaním (komparačný algoritmus)&lt;br /&gt;
* stabilita triedenia: stabilný&lt;br /&gt;
* miesto triedenia: externé triedenie (vhodný na triedenie veľkých objemov dát uložených na disku)&lt;br /&gt;
&lt;br /&gt;
===Princíp algoritmu===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Algoritmus MergeSort vykonáva 4 základné úlohy:&lt;br /&gt;
# Delenie poľa na dve polovice.&lt;br /&gt;
# Triedenie ľavej polovice poľa.&lt;br /&gt;
# Triedenie pravej polovice poľa.&lt;br /&gt;
# Zlúčenie oboch polovíc pomocou funkcie Merge.&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Algoritmus Merge vykonáva 3 základné úlohy:&lt;br /&gt;
# Vonkajší cyklus: určenie veľkosti zoznamu na zlučovanie&lt;br /&gt;
# Vnútorný cyklus: prechádzanie jednotlivých zoznamov v poli&lt;br /&gt;
# Zlučovanie jednotlivých zoznamov pomocou funkcie Merge&lt;br /&gt;
&lt;br /&gt;
===Slovný opis algoritmu===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Našou úlohou je vzostupne (min - max) utriediť vstupné pole. Určíme si stred poľa (pri párnom počte prvkov je to ten menší z prostredných indexov). Následne vykonávame sériu rekurzívnych delení pre ľavú a pravú časť poľa (začiatok ... stred ; stred + 1 ... koniec) až do momentu, keď nám ostanú len jednoprvkové podpolia (tie sú už utriedené). Následne v každom volaní obe tieto podpolia zlúčime pomocou algoritmu Merge do väčších podpolí (2, 4, 8, ...), až nakoniec dostaneme jedno výsledné utriedené pole.&lt;br /&gt;
[[Súbor:MergeSort It.png|400px|náhľad|vpravo|Vizualizácia iteračnej verzie algoritmu MergeSort]]&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Vstupné pole, ktoré má ''N'' prvkov, môžeme chápať, ako ''N'' rôznych jednoprvkových (utriedených) podpolí, ktoré máme zlúčiť do jedného výsledného ''N''-prvkového utriedeného poľa. Keďže by bolo veľmi nepraktické zlučovať ''N'' podpolí naraz, zvolíme nasledovnú stratégiu: Budeme prechádzať dané pole od začiatku po koniec a v prvom cykle zlúčime každé dva prvky, takže budeme mať &amp;lt;math&amp;gt;\frac{n}{2}&amp;lt;/math&amp;gt; dvojprvkových  utriedených podpolí. Potom v druhom cykle zlúčime každé 4 prvky do jedného podpoľa, v treťom cykle každých 8, až do momentu, keď dostaneme jedno utriedené pole. &lt;br /&gt;
Aby sme to docielili, potrebujeme dva cykly, vonkajší, ktorý nastaví maximálnu veľkosť podpoľa, ktoré ideme zlučovať (1,2,4,8 ... dlzka - 1) a vnútorný, ktorý prechádza jednotlivé podpolia. Následne už iba voláme funkciu Merge, ktorá dané podpolia zlučuje. &lt;br /&gt;
&lt;br /&gt;
Poznámka, ak máme pole, ktoré má nepárny počet prvkov, tak ten posledný prvok nezlúčime hneď v prvom cykle, ale až v tých ďalších. Takisto, ak n nie je mocnina čísla 2, tak musíme samozrejme ošetriť situáciu, kedy by sme sa dostali mimo rozsah poľa (Ak máme napríklad pole, čo má 7 prvkov, tak po prvej iterácii budú prvky utiredené podľa vzoru 2 + 2 + 2 + 1, po druhej 4 + 3, a po tretej 7)&lt;br /&gt;
&lt;br /&gt;
===Pseudokód===&lt;br /&gt;
====Rekurzívna verzia====&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči volanie, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;stred = lavy + (pravy - lavy) / 2&amp;lt;/code&amp;gt;, pričom znak ''/''  vyjadruje celočíselné delenie.&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], lavy , stred)&amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Rekurzívne zavolaj funkciu &amp;lt;code&amp;gt;MergeSort(pole[], stred + 1 , pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Zavolaj funkciu &amp;lt;code&amp;gt;Merge(pole[], lavy, stred, pravy)&amp;lt;/code&amp;gt;&lt;br /&gt;
:5. Skonči volanie.&lt;br /&gt;
&lt;br /&gt;
====Iteračná verzia====&lt;br /&gt;
Nech nech má funkcia MergeSort nasledovný prototyp: &amp;lt;code&amp;gt;MergeSort(pole[], lavy, pravy) &amp;lt;/code&amp;gt;  &lt;br /&gt;
:1. Je &amp;lt;code&amp;gt;lavy &amp;gt;= pravy&amp;lt;/code&amp;gt; ? Ak áno, skonči, inak pokračuj krokom 2.&lt;br /&gt;
:2. Nech: &amp;lt;code&amp;gt;dlzka_subzoznamu = 1 &amp;lt;/code&amp;gt;&lt;br /&gt;
:3. Nech: &amp;lt;code&amp;gt;zaciatok = lavy&amp;lt;/code&amp;gt;&lt;br /&gt;
:4. Je&amp;lt;code&amp;gt;dlzka_subzoznamu &amp;lt;= pravy&amp;lt;/code&amp;gt; ? Ak áno pokračuj krokom 4.1, inak skonči.&lt;br /&gt;
:::4.1. Je&amp;lt;code&amp;gt;zaciatok &amp;lt; pravy&amp;lt;/code&amp;gt; Ak áno pokračuj krokom 4.1.1, inak skoč na krok 4.2.&lt;br /&gt;
:::::4.1.1. Je &amp;lt;code&amp;gt;zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = zaciatok + 2 * dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.1.1. Nech &amp;lt;code&amp;gt;koniec = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.2. Je &amp;lt;code&amp;gt;zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy&amp;lt;/code&amp;gt; ?&lt;br /&gt;
:::::::Ak áno:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = zaciatok + dlzka_zoznamu - 1&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::::Ak nie:&lt;br /&gt;
:::::::::4.1.2.1. Nech &amp;lt;code&amp;gt;stred = pravy&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.3. &amp;lt;code&amp;gt;Merge(pole[], zaciatok, stred, koniec)&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.4. &amp;lt;code&amp;gt;zaciatok += 2 * dlzka_subzoznamu&amp;lt;/code&amp;gt;&lt;br /&gt;
:::::4.1.5. Skoč na krok 4.1.&lt;br /&gt;
:::4.2. &amp;lt;code&amp;gt;dlzka_subzoznamu *= 2&amp;lt;/code&amp;gt;&lt;br /&gt;
:::4.3 Skoč na krok 4.&lt;br /&gt;
&lt;br /&gt;
==Implementácia algoritmov Merge a MergeSort==&lt;br /&gt;
===Rekurzívna verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
   int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   free(L);&lt;br /&gt;
   free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C++&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using std::cout;&lt;br /&gt;
using std::endl;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    cout&amp;lt;&amp;lt;endl&amp;lt;&amp;lt;&amp;quot;Utriedené pole:&amp;quot;&amp;lt;&amp;lt;endl;&lt;br /&gt;
&lt;br /&gt;
    for (auto i: pole)&lt;br /&gt;
    {&lt;br /&gt;
        cout&amp;lt;&amp;lt;i&amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
   /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
   /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int L_dlzka = stred - lavy + 1;&lt;br /&gt;
   int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
   /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
   int *L = new int[L_dlzka];&lt;br /&gt;
   int *P = new int[P_dlzka];&lt;br /&gt;
&lt;br /&gt;
   /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
   int i, j, k;&lt;br /&gt;
&lt;br /&gt;
   /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
   for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
   {&lt;br /&gt;
       L[i] = pole[lavy + i];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
   {&lt;br /&gt;
       P[j] = pole[stred + 1 + j];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
   i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
  /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       if(L[i] &amp;lt;= P[j])&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = L[i++];&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
           pole[k++] = P[j++];&lt;br /&gt;
       }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(i &amp;lt; L_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = L[i++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
   while(j &amp;lt; P_dlzka)&lt;br /&gt;
   {&lt;br /&gt;
       pole[k++] = P[j++];&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
   delete []L;&lt;br /&gt;
   delete []P;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSort(int pole[], int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    /* urči si prostredný index */&lt;br /&gt;
&lt;br /&gt;
    int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
    /* utrieď ľavú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, lavy, stred);&lt;br /&gt;
&lt;br /&gt;
    /* utrieď pravú polovicu poľa */&lt;br /&gt;
&lt;br /&gt;
    MergeSort(pole, stred+1, pravy);&lt;br /&gt;
&lt;br /&gt;
    /* zlúč obe polovice dokopy */&lt;br /&gt;
&lt;br /&gt;
    Merge(pole, lavy, stred, pravy);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Java&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Java&amp;quot;&amp;gt;&lt;br /&gt;
class MergeSort {&lt;br /&gt;
    /* Zlúči 2 subpolia, ktoré sa vytvorili z pôvodného pola.&lt;br /&gt;
    * Každé subpole má polovičnú dĺžku pôvodného pola.&lt;br /&gt;
    * subpole1 [ľavý..stred]&lt;br /&gt;
    * subpole2 [stred+1..pravý] */&lt;br /&gt;
    void merge(int[] pole, int lavy, int stred, int pravy) {&lt;br /&gt;
        // Výpočet dĺžky 2 subpolí&lt;br /&gt;
        int n1 = stred - lavy + 1;&lt;br /&gt;
        int n2 = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
        // Vytvorenie pomocných polí&lt;br /&gt;
        int[] L = new int[n1];&lt;br /&gt;
        int[] P = new int[n2];&lt;br /&gt;
&lt;br /&gt;
        // Načítanie dát do pomocných polí&lt;br /&gt;
        for (int i = 0; i &amp;lt; n1; i++)&lt;br /&gt;
            L[i] = pole[lavy + i];&lt;br /&gt;
&lt;br /&gt;
        for (int j = 0; j &amp;lt; n2; j++)&lt;br /&gt;
            P[j] = pole[stred + 1 + j];&lt;br /&gt;
&lt;br /&gt;
        // Počiatočné indexy prvého a druhého subpola&lt;br /&gt;
        int i = 0, j = 0;&lt;br /&gt;
        // Počiatočný index zlúčeného subpola&lt;br /&gt;
        int k = lavy;&lt;br /&gt;
&lt;br /&gt;
        // Zlúčenie dvoch podpolí&lt;br /&gt;
        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {&lt;br /&gt;
            if (L[i] &amp;lt;= P[j]) {&lt;br /&gt;
                pole[k] = L[i];&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                pole[k] = P[j];&lt;br /&gt;
                j++;&lt;br /&gt;
            }&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* V prípade, že v jednom zo subpolí sa nachádzajú prvky, ktoré neboli zlúčené do pola,&lt;br /&gt;
        * tak sa do pola jednoducho skopírujú */&lt;br /&gt;
        while (i &amp;lt; n1) {&lt;br /&gt;
            pole[k] = L[i];&lt;br /&gt;
            i++;&lt;br /&gt;
            k++;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        while (j &amp;lt; n2) {&lt;br /&gt;
            pole[k] = P[j];&lt;br /&gt;
            k++;&lt;br /&gt;
            j++;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* Funkcia, ktorá zoradí pole použitím funkcie merge() */&lt;br /&gt;
    void sort (int[] pole, int lavy, int pravy) {&lt;br /&gt;
        if (lavy &amp;lt; pravy) {&lt;br /&gt;
            //Musíme nájsť stred pola&lt;br /&gt;
            int stred = lavy + (pravy - lavy) / 2;&lt;br /&gt;
&lt;br /&gt;
            // Zoradíme prvú a druhú polovicu pola samostatne&lt;br /&gt;
            sort(pole, lavy, stred);&lt;br /&gt;
            sort(pole, stred + 1, pravy);&lt;br /&gt;
&lt;br /&gt;
            // Zlúčime zoradené polovice do jedného pola&lt;br /&gt;
            merge(pole, lavy, stred, pravy);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class Main {&lt;br /&gt;
    /* Funkcia na výpis pola dĺžky n */&lt;br /&gt;
    static void vypis_pole(int[] pole) {&lt;br /&gt;
        int n = pole.length;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
            System.out.print(pole[i] + &amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    /* Hlavný program */&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
	    int[] pole = {12, 11, 13, 5, 6, 7};&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Zadané pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
&lt;br /&gt;
        MergeSort ms = new MergeSort();&lt;br /&gt;
        ms.sort(pole, 0, pole.length - 1);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;\nZoradené pole:&amp;quot;);&lt;br /&gt;
        vypis_pole(pole);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Python3&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Python3&amp;quot;&amp;gt;&lt;br /&gt;
def MergeSort(pole):&lt;br /&gt;
    if len(pole) &amp;gt; 1:&lt;br /&gt;
        # Nájdenie stredu pola&lt;br /&gt;
        # zápis len(pole)//2 znamená, že dĺžka pola sa vydelí 2 a výsledok je celé číslo&lt;br /&gt;
        stred = len(pole) // 2&lt;br /&gt;
&lt;br /&gt;
        # Rozdelenie pola na dve časti&lt;br /&gt;
        L = pole[:stred]&lt;br /&gt;
        P = pole[stred:]&lt;br /&gt;
&lt;br /&gt;
        # Zoradenie najskôr prvej časti pola, potom druhej&lt;br /&gt;
        MergeSort(L)&lt;br /&gt;
        MergeSort(P)&lt;br /&gt;
&lt;br /&gt;
        i = j = k = 0&lt;br /&gt;
&lt;br /&gt;
        # Načítanie dát do pomocných polí L[] a P[]&lt;br /&gt;
        while i &amp;lt; len(L) and j &amp;lt; len(P):&lt;br /&gt;
            if L[i] &amp;lt; P[j]:&lt;br /&gt;
                pole[k] = L[i]&lt;br /&gt;
                i += 1&lt;br /&gt;
            else:&lt;br /&gt;
                pole[k] = P[j]&lt;br /&gt;
                j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        # Kontrola či všetky prvky boli zlúčené dokopy,&lt;br /&gt;
        # ak nie, tak sa do zlúčeného pola jednoducho skopírujú&lt;br /&gt;
        while i &amp;lt; len(L):&lt;br /&gt;
            pole[k] = L[i]&lt;br /&gt;
            i += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
        while j &amp;lt; len(P):&lt;br /&gt;
            pole[k] = P[j]&lt;br /&gt;
            j += 1&lt;br /&gt;
            k += 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Kód na výpis pola&lt;br /&gt;
def vypis_pole(pole):&lt;br /&gt;
    for i in range(len(pole)):&lt;br /&gt;
        print(pole[i], end=&amp;quot; &amp;quot;)&lt;br /&gt;
    print()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Hlavný program&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    pole = [12, 11, 13, 5, 6, 7]&lt;br /&gt;
    print(&amp;quot;Zadané pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
    MergeSort(pole)&lt;br /&gt;
    print(&amp;quot;Zoradené pole:&amp;quot;, end=&amp;quot;\n&amp;quot;)&lt;br /&gt;
    vypis_pole(pole)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Iteračná verzia algoritmov===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;C&amp;quot; block&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy);&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy);&lt;br /&gt;
&lt;br /&gt;
/* hlavný program */&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    int pole[] = {12, 11, 13, 5, 6, 7, 19};&lt;br /&gt;
    int dlzka_pola = sizeof(pole) / sizeof(pole[0]);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Pôvodné pole %d: \n&amp;quot;, dlzka_pola);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    MergeSortIt(pole, 0, dlzka_pola - 1);&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;\nUtriedené pole: \n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; dlzka_pola; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        printf(&amp;quot;%d &amp;quot;, pole[i]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Merge(int pole[], int lavy, int stred, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči */&lt;br /&gt;
&lt;br /&gt;
    if (lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* vyrátaj dĺžky oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int L_dlzka = stred - lavy + 1;&lt;br /&gt;
    int P_dlzka = pravy - stred;&lt;br /&gt;
&lt;br /&gt;
    /* alokuj dočasné polia, kam uložíš prvky z oboch polovíc poľa */&lt;br /&gt;
&lt;br /&gt;
    int *L = (int*)malloc(L_dlzka * sizeof(int));&lt;br /&gt;
    int *P = (int*)malloc(P_dlzka * sizeof(int));&lt;br /&gt;
&lt;br /&gt;
    /* indexy, ktorými iterujeme všetky polia: i pre L, j pre P, k pre pole */&lt;br /&gt;
&lt;br /&gt;
    int i, j, k;&lt;br /&gt;
&lt;br /&gt;
    /* skopíruj obsah oboch polovíc poľa do dočasných polí L a P */&lt;br /&gt;
&lt;br /&gt;
    for (i = 0; i &amp;lt; L_dlzka; ++i)&lt;br /&gt;
    {&lt;br /&gt;
        L[i] = pole[lavy + i];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    for (j = 0; j &amp;lt; P_dlzka; ++j)&lt;br /&gt;
    {&lt;br /&gt;
        P[j] = pole[stred + 1 + j];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* nastav indexy na začiatok daných polí */&lt;br /&gt;
&lt;br /&gt;
    i = 0; j = 0; k = lavy;&lt;br /&gt;
&lt;br /&gt;
    /* zlučuj dočasné polia L a P do finálneho poľa pole */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka &amp;amp;&amp;amp; j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        if(L[i] &amp;lt;= P[j])&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = L[i++];&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            pole[k++] = P[j++];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli L, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(i &amp;lt; L_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = L[i++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* ak ostali nejaké prvky v dočasnom poli P, skopíruj ich do finálneho poľa */&lt;br /&gt;
&lt;br /&gt;
    while(j &amp;lt; P_dlzka)&lt;br /&gt;
    {&lt;br /&gt;
        pole[k++] = P[j++];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /* uvoľni použitú pamäť */&lt;br /&gt;
&lt;br /&gt;
    free(L);&lt;br /&gt;
    free(P);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MergeSortIt(int *pole, int lavy, int pravy)&lt;br /&gt;
{&lt;br /&gt;
    /* ak má pole menej ako 2 prvky, skonči volanie */&lt;br /&gt;
&lt;br /&gt;
    if(lavy &amp;gt;= pravy)&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    int stred, koniec;&lt;br /&gt;
&lt;br /&gt;
    for (int dlzka_zoznamu = 1; dlzka_zoznamu &amp;lt;= pravy ; dlzka_zoznamu *= 2)&lt;br /&gt;
    {&lt;br /&gt;
        for (int zaciatok = lavy; zaciatok &amp;lt; pravy ; zaciatok += 2 * dlzka_zoznamu)&lt;br /&gt;
        {&lt;br /&gt;
             koniec = (zaciatok + 2 * dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + 2 * dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             stred = (zaciatok + dlzka_zoznamu - 1 &amp;lt;= pravy) ? zaciatok + dlzka_zoznamu - 1 : pravy;&lt;br /&gt;
&lt;br /&gt;
             Merge(pole, zaciatok, stred, koniec);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Odkazy==&lt;br /&gt;
# https://www.geeksforgeeks.org/merge-sort/&lt;br /&gt;
# https://www.geeksforgeeks.org/iterative-merge-sort/&lt;br /&gt;
# https://medium.com/@paulsoham/merge-sort-63d75df76388&lt;br /&gt;
# https://www.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort&lt;br /&gt;
# https://www.tutorialspoint.com/data_structures_algorithms/merge_sort_algorithm.htm&lt;br /&gt;
# https://www.youtube.com/watch?v=6pV2IF0fgKY&lt;br /&gt;
# https://www.youtube.com/watch?v=mB5HXBb_HY8&lt;br /&gt;
# https://www.youtube.com/watch?v=ak-pz7tS5DE&lt;/div&gt;</summary>
		<author><name>Filip Tomek</name></author>
		
	</entry>
</feed>