<?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=Mat%C3%BA%C5%A1+Ne%C4%8Das</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=Mat%C3%BA%C5%A1+Ne%C4%8Das"/>
	<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php/%C5%A0peci%C3%A1lne:Pr%C3%ADspevky/Mat%C3%BA%C5%A1_Ne%C4%8Das"/>
	<updated>2026-04-30T06:22:28Z</updated>
	<subtitle>Príspevky používateľa</subtitle>
	<generator>MediaWiki 1.34.0</generator>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:MCU_I2C_3_casovyDiagram.png&amp;diff=13253</id>
		<title>Súbor:MCU I2C 3 casovyDiagram.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:MCU_I2C_3_casovyDiagram.png&amp;diff=13253"/>
		<updated>2023-03-21T20:28:02Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Mcu_i2c_1_pripojenie.png&amp;diff=13249</id>
		<title>Súbor:Mcu i2c 1 pripojenie.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Mcu_i2c_1_pripojenie.png&amp;diff=13249"/>
		<updated>2023-03-21T20:24:19Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: Matúš Nečas nahral novú verziu Súbor:Mcu i2c 1 pripojenie.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:Mcu_i2c_1_pripojenie.png&amp;diff=13247</id>
		<title>Súbor:Mcu i2c 1 pripojenie.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:Mcu_i2c_1_pripojenie.png&amp;diff=13247"/>
		<updated>2023-03-21T20:21:17Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13236</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=13236"/>
		<updated>2021-04-19T16:50:39Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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;
==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[max]&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[max]&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};&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[max])&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[max])&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;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 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;
&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 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;
&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;
&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[max])&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[max])&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(pole[max], 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(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áč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 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;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;
&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 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;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 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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13235</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=13235"/>
		<updated>2021-04-19T16:49:38Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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;
==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[max] &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[max] &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};&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[max])&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[max])&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;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 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;
&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 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;
&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;
&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[max])&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[max])&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(pole[max], 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(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áč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 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;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;
&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 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;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 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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13234</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=13234"/>
		<updated>2021-04-19T16:49:03Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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;
==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};&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[max])&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[max])&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;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 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;
&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 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;
&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;
&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[max])&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[max])&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(pole[max], 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(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áč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 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;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;
&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 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;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 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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13233</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=13233"/>
		<updated>2021-04-19T16:10:57Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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;
==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};&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[max])&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[max])&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;
&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 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;
&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;
&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[max])&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[max])&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(pole[max], 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(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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13232</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=13232"/>
		<updated>2021-04-19T16:08:50Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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;
==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};&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[max])&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[max])&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13230</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=13230"/>
		<updated>2021-04-19T15:55:04Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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;
==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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13229</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=13229"/>
		<updated>2021-04-19T15:54:02Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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;
==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 lang=&amp;quot;C++&amp;quot;&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&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13226</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=13226"/>
		<updated>2021-04-19T15:43:19Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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;
==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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13225</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=13225"/>
		<updated>2021-04-19T15:42:25Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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;
==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 - 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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13223</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=13223"/>
		<updated>2021-04-19T15:41:27Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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;
==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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13222</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=13222"/>
		<updated>2021-04-19T15:39:36Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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;
==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. 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;
[[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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13221</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=13221"/>
		<updated>2021-04-19T15:37:18Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Zmazanie hromady */&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. 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;
[[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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13220</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=13220"/>
		<updated>2021-04-19T15:35:42Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Zmazanie hromady */&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, závisí len to, ako implementujeme algoritmus 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. 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;
[[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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13219</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=13219"/>
		<updated>2021-04-19T15:35:15Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Zmazanie hromady */&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, závisí len to, ako implementujeme algoritmus 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. 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;
[[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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13218</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=13218"/>
		<updated>2021-04-19T15:33:35Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Zmazanie hromady */&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 \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;
Z hľadiska implementácie môžeme vytvoriť rekurzívnu aj iteračnú verziu, závisí len to, ako implementujeme algoritmus 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. 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;
[[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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_zlu%C4%8Dovan%C3%ADm&amp;diff=13217</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=13217"/>
		<updated>2021-04-19T15:30:06Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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;
&lt;br /&gt;
==Merge Sort==&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é 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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13216</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=13216"/>
		<updated>2021-04-19T15:29:19Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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 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 \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;
Z hľadiska implementácie môžeme vytvoriť rekurzívnu aj iteračnú verziu, závisí len to, ako implementujeme algoritmus 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. 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;
[[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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13215</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=13215"/>
		<updated>2021-04-19T15:21:57Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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ť 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 s maximálnou hodnotou i-teho prvku.&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 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 \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;
Z hľadiska implementácie môžeme vytvoriť rekurzívnu aj iteračnú verziu, závisí len to, ako implementujeme algoritmus 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. 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;
[[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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13214</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=13214"/>
		<updated>2021-04-19T15:20:29Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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ť 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 s maximálnou hodnotou i-teho prvku.&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. 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 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 \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;
Z hľadiska implementácie môžeme vytvoriť rekurzívnu aj iteračnú verziu, závisí len to, ako implementujeme algoritmus 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. 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;
[[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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13213</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=13213"/>
		<updated>2021-04-19T15:19:15Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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: ľ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ť 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 s maximálnou hodnotou i-teho prvku.&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. 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 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 \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;
Z hľadiska implementácie môžeme vytvoriť rekurzívnu aj iteračnú verziu, závisí len to, ako implementujeme algoritmus 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. 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;
[[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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13212</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=13212"/>
		<updated>2021-04-19T15:16:44Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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: ľ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ť 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 s maximálnou hodnotou i-teho prvku.&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 ľ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. 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 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 \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;
Z hľadiska implementácie môžeme vytvoriť rekurzívnu aj iteračnú verziu, závisí len to, ako implementujeme algoritmus 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. 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;
[[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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13211</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=13211"/>
		<updated>2021-04-19T15:15:18Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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: ľ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ť 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 s maximálnou hodnotou i-teho prvku.&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: Priebeh algoritmu je vyobrazený pomocou poľa, ktoré triedime a binárnej hromady, ktorú dané pole reprezentuje. 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 člena a prvky zafarbené na zeleno vyjadrujú ľavú pohromadu i-teho člena. 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 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 \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;
Z hľadiska implementácie môžeme vytvoriť rekurzívnu aj iteračnú verziu, závisí len to, ako implementujeme algoritmus 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. 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;
[[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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13210</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=13210"/>
		<updated>2021-04-19T15:12:14Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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: ľ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ť 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 s maximálnou hodnotou i-teho prvku.&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: Priebeh algoritmu je vyobrazený pomocou poľa a binárnej hromady. 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, prvky vyfarené na zeleno vyjadrujú pravú pohromadu. 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 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 \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;
Z hľadiska implementácie môžeme vytvoriť rekurzívnu aj iteračnú verziu, závisí len to, ako implementujeme algoritmus 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. 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;
[[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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13209</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=13209"/>
		<updated>2021-04-19T15:07:52Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Základné časti 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;
==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|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 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 s maximálnou hodnotou i-teho prvku.&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: Priebeh algoritmu je vyobrazený pomocou poľa a binárnej hromady. 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, prvky vyfarené na zeleno vyjadrujú pravú pohromadu. 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 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 \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;
Z hľadiska implementácie môžeme vytvoriť rekurzívnu aj iteračnú verziu, závisí len to, ako implementujeme algoritmus 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. 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;
[[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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13208</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=13208"/>
		<updated>2021-04-19T13:25:36Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* ZČ */&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|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 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 s maximálnou hodnotou i-teho prvku.&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: Priebeh algoritmu je vyobrazený pomocou poľa a binárnej hromady. 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, prvky vyfarené na zeleno vyjadrujú pravú pohromadu. 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 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 \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;
Z hľadiska implementácie môžeme vytvoriť rekurzívnu aj iteračnú verziu, závisí len to, ako implementujeme algoritmus 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. 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;
[[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;
# Nájdenie minima v nezoradenej časti.&lt;br /&gt;
# Umiestnenie minima na koniec zoradenej časti. (výmenou minima a i-teho prvku)&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13207</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=13207"/>
		<updated>2021-04-19T13:22:42Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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|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 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 s maximálnou hodnotou i-teho prvku.&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: Priebeh algoritmu je vyobrazený pomocou poľa a binárnej hromady. 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, prvky vyfarené na zeleno vyjadrujú pravú pohromadu. 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 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 \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;
Z hľadiska implementácie môžeme vytvoriť rekurzívnu aj iteračnú verziu, závisí len to, ako implementujeme algoritmus 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. 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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13206</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=13206"/>
		<updated>2021-04-19T13:11:06Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Slovný opis */&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|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 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 s maximálnou hodnotou i-teho prvku.&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|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 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 \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;
Z hľadiska implementácie môžeme vytvoriť rekurzívnu aj iteračnú verziu, závisí len to, ako implementujeme algoritmus 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. 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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13205</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=13205"/>
		<updated>2021-04-19T13:08:24Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Zmazanie hromady */&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|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 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 s maximálnou hodnotou i-teho prvku.&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|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 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 \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;
====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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13204</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=13204"/>
		<updated>2021-04-19T13:00:03Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Vytvorenie hromady */&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|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 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 s maximálnou hodnotou i-teho prvku.&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|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 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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13203</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=13203"/>
		<updated>2021-04-19T12:58:48Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Vytvorenie hromady */&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|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 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 s maximálnou hodnotou i-teho prvku.&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|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 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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13202</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=13202"/>
		<updated>2021-04-19T12:57:33Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Vytvorenie hromady */&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|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 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 s maximálnou hodnotou i-teho prvku.&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|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{rodič posledného potomka:} \ \  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 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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13201</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=13201"/>
		<updated>2021-04-19T09:34:43Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Vytvorenie hromady */&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|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 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 s maximálnou hodnotou i-teho prvku.&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|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 prvok, ktorý je najspodnejší, najviac vpravo a zároveň má aspoň jedného potomka. Tento prvok určíme tak, že zoberieme posledný prvok v poli a pomocou rovnice 3, z časti prehľad, ktorú si jemne upravíme, nájdeme jeho 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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13200</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=13200"/>
		<updated>2021-04-19T09:07:48Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Vytvorenie hromady */&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|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 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 s maximálnou hodnotou i-teho prvku.&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|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. Najskôr si určíme prvok ktorý je najspodnejší, 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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13199</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=13199"/>
		<updated>2021-04-19T09:06:36Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Základné časti 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;
==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|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 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 s maximálnou hodnotou i-teho prvku.&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|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. 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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13198</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=13198"/>
		<updated>2021-04-19T09:05:08Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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|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 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 s maximálnou hodnotou i-teho prvku.&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|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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13197</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=13197"/>
		<updated>2021-04-19T09:04:20Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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;
==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|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 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 s maximálnou hodnotou i-teho prvku.&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 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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13196</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=13196"/>
		<updated>2021-04-19T08:50:28Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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;
==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|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 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 s maximálnou hodnotou i-teho prvku.&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. 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;
:::::3.1. Nech: &amp;lt;code&amp;gt;max = lavy&amp;lt;/code&amp;gt; &lt;br /&gt;
::: Ak nie:&lt;br /&gt;
:::::3.1. Pokračuj krokom 4. &lt;br /&gt;
:4. 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;
:::::4.1. Nech: &amp;lt;code&amp;gt;max = pravy&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;pole[max] &amp;gt; pole[i]&amp;lt;/code&amp;gt; ? &lt;br /&gt;
::: Ak áno:&lt;br /&gt;
::::: 5.1. Vymeň: &amp;lt;code&amp;gt;pole[i] a pole[max]&amp;lt;/code&amp;gt;&lt;br /&gt;
::::: 5.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;
::::: 5.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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13195</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=13195"/>
		<updated>2021-04-19T08:26:17Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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|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 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 s maximálnou hodnotou i-teho prvku.&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. 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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13194</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=13194"/>
		<updated>2021-04-19T08:01:00Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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|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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13193</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=13193"/>
		<updated>2021-04-19T07:59:01Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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 (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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13192</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=13192"/>
		<updated>2021-04-18T19:29:23Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Slovný opis 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;
==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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13191</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=13191"/>
		<updated>2021-04-18T19:29:01Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Selection 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 (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;
[[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Č===&lt;br /&gt;
ejshfjskfskfhdjksfjhdsfjdshfkanoôadkmslJDHKMSALMjbdv ,ksalmncv asd&lt;br /&gt;
das&lt;br /&gt;
sadas&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dsa&lt;br /&gt;
dasdkljasdklsajdsajdsa&lt;br /&gt;
dsadsadjsakldjsakldsa&lt;br /&gt;
dasd&lt;br /&gt;
sad&lt;br /&gt;
asd&lt;br /&gt;
sakdsalôdsaôkdsa&lt;br /&gt;
dsa&lt;br /&gt;
d&lt;br /&gt;
sadsadkljsadkljsa&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13190</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=13190"/>
		<updated>2021-04-18T19:28:11Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Selection 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 (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;
[[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Č===&lt;br /&gt;
&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=S%C3%BAbor:SelectionSort.png&amp;diff=13189</id>
		<title>Súbor:SelectionSort.png</title>
		<link rel="alternate" type="text/html" href="http://www.kiwiki.info/index.php?title=S%C3%BAbor:SelectionSort.png&amp;diff=13189"/>
		<updated>2021-04-18T19:26:39Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Vizualizácia algoritmu Selection Sort&lt;/div&gt;</summary>
		<author><name>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13188</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=13188"/>
		<updated>2021-04-15T18:42:29Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Selection 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 (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;
===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Č===&lt;br /&gt;
&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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13187</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=13187"/>
		<updated>2021-04-15T18:16:48Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* Selection 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 (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;
===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;
==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>Matúš Nečas</name></author>
		
	</entry>
	<entry>
		<id>http://www.kiwiki.info/index.php?title=Triedenie_v%C3%BDberom&amp;diff=13186</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=13186"/>
		<updated>2021-04-15T18:00:00Z</updated>

		<summary type="html">&lt;p&gt;Matúš Nečas: /* 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 (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;
===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;
&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>Matúš Nečas</name></author>
		
	</entry>
</feed>