Triedenie zlučovaním: Rozdiel medzi revíziami
| Riadok 17: | Riadok 17: | ||
===Vzorový príklad:=== | ===Vzorový príklad:=== | ||
Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vyptvorí pomocné polia p1 = [1, 3, 5] a p2 = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre p1 index i a p2 index j. | Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vyptvorí pomocné polia p1 = [1, 3, 5] a p2 = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre p1 index i a p2 index j. | ||
| + | [[Súbor:Funkcia merge.png|1100px|náhľad|stred|Vizualizácia funkcie Merge]] | ||
| + | |||
===Pseudokód=== | ===Pseudokód=== | ||
| − | Nech funkcia Merge má parametre, pole[], lavy, stred a pravy. | + | Nech funkcia Merge má parametre, <code>pole[], lavy, stred a pravy</code>. |
| − | + | :1. Nech: <code>i = 0, j = 0, k = 0 </code> | |
| − | + | :2. Nech: <code> p1 = pole[lavy ... stred], p2 = pole[stred + 1 ... pravy] </code> | |
| − | + | :3. Je <code>i <= (stred - lavy)</code> a zároveň <code>j < (pravy - stred)</code> ? Ak áno, pokračuj krokom 3.1., inak skok na krok 4. | |
| − | + | :::3.1. Je <code>p1[i] <= p2[j]</code>? Ak áno, <code>pole[k++] = p1[i++]</code>, inak <code>pole[k++] = p2[j++]</code>. | |
| − | + | :::3.2. Skok na krok 3. | |
| − | + | :4. Je <code>i <= (stred - lavy)</code> ? Ak áno, pokračuj krokom 4.1., inak skok na krok 5. | |
| − | + | :::4.1. <code>pole[k++] = p1[i++]</code> | |
| − | + | :::4.2. Skok na krok 4. | |
| − | |||
| − | [[ | ||
| + | :5. Je <code>j < (pravy - stred)</code> ? Ak áno, pokračuj krokom 5.1., inak skonči program. | ||
| + | :::5.1. <code>pole[k++] = p2[j++]</code> | ||
| + | :::5.2. Skok na krok 5. | ||
==Merge sort== | ==Merge sort== | ||
Verzia zo dňa a času 19:09, 22. marec 2021
Obsah
Zlučovacia funkcia Merge:
Funkcia Merge je zlučovacia funkcia, ktorá tvorí základ triediaceho algoritmu Merge sort.
Princíp zlučovania:
Vo všeobecnosti princíp zlučovania tkvie v tom, že zoberieme dva (alebo viac) menšie utriedné zoznamy, ktoré skombinujeme do jedného väčšieho utriedeného zoznamu. Zoznam môže byť reprezentovaný ako dátová štruktúra pole alebo aj ako lineárny zoznam. V tejto časti sa zameriame na algoritmus pre dátovú štruktúru pole.
Slovný opis algoritmu:
Pri funkcii Merge využívame princíp zlučovania tak, že máme pole, ktoré sa skladá z dvoch už utriedených polovíc. Následne si vytvoríme dve pomocné polia, do ktorých skopíruje obsahy oboch polovíc. Potom súčasne prechádzame obe pomocné polia a vždy z uvažovanej dvojice prvkov vyberáme ten menší z nich (keď triedime od najväčšieho po najmenší) a vložíme ho na začiatok pôvodného poľa. Index zvýšime iba pri tom poli z ktorého sme daný prvok vybrali. Ak nastane situácia, že z jedného pomocného poľa vyberieme všetky prvky skôr, ako z druhého pomocného poľa, potom zbytok druhého pomocného poľa už iba kopírujeme na koniec pôvodného poľa.
Vzorový príklad:
Máme pole prvkov p = [1, 3, 5, 2, 4, 6], ktoré je už čiastočne utriedené. Použijeme algoritmus Merge, ktorý si vyptvorí pomocné polia p1 = [1, 3, 5] a p2 = [2, 4, 6]. Všetky polia indexujeme od 0, pričom pre pole p používame index k, pre p1 index i a p2 index j.
Pseudokód
Nech funkcia Merge má parametre, pole[], lavy, stred a pravy.
- 1. Nech:
i = 0, j = 0, k = 0 - 2. Nech:
p1 = pole[lavy ... stred], p2 = pole[stred + 1 ... pravy] - 3. Je
i <= (stred - lavy)a zároveňj < (pravy - stred)? Ak áno, pokračuj krokom 3.1., inak skok na krok 4.- 3.1. Je
p1[i] <= p2[j]? Ak áno,pole[k++] = p1[i++], inakpole[k++] = p2[j++]. - 3.2. Skok na krok 3.
- 3.1. Je
- 4. Je
i <= (stred - lavy)? Ak áno, pokračuj krokom 4.1., inak skok na krok 5.- 4.1.
pole[k++] = p1[i++] - 4.2. Skok na krok 4.
- 4.1.
- 5. Je
j < (pravy - stred)? Ak áno, pokračuj krokom 5.1., inak skonči program.- 5.1.
pole[k++] = p2[j++] - 5.2. Skok na krok 5.
- 5.1.
Merge sort
Merge Sort je triediaci algoritmus, ktorý je založený na princípe "rozdeľ a panuj", čo znamená, že pole najskôr rozdelí na dve polovice, tie zoradí a potom ich zlúči naspäť dokopy. Keďže najhoršia doba výpočtu je [math]O(n.log(n))[/math], tak sa radí medzi najpoužívanejšie a najviac rešpektované triediacie algoritmy.
Princíp algoritmu
Algoritmus Merge sort má dve časti Základom algoritmu