MergeSort

Z CHWiki

Přejít na: navigace, hledání

[editovat] Popis

Merge sort patrí k pokorčilejším triediacim algoritmom. Je to rekurzívny algoritmus a pracuje na princípe rozdeľ a panuj, jeho nevýhodou je potreba pomocného poľa. Merge sort rozdelí pole na polovice, každú túto polovicu rekurzívne spracuje (rozdelí aj tieto polovice na ďalšie polovice), a potom ich spojí, pričom ich nespojí tak, že jednoducho dá jednu za druhú, ale prvky z druhej polovice dá na správne miesto do prvej (samotné polovice sú utriedené, lebo algoritmus bol na ne rekurzívne volaný).

[editovat] Príklad

pole na pred triedením
  6 8 4 5 2 3 1 7 0 9

1. rozdelenie
  6 8 4 5 2  |  3 1 7 0 9
2. rozdelenie
  6 8  |  4 5 2  | 3 1  |  7 0 9
3. rozdelenie
  6  |  8  |  4  |  5 2  |  3  |  1  |  7  |  0 9
4. rozdelenie
  6  |  8  |  4  |  5  |  2  |  3  |  1  |  7  |  0  |  9

spájanie
  6  |  8  |  4  |  2 5  |  3  |  1  |  7  |  0 9	
  6 8  |  2 4 5  |  1 3  |  0 7 9  
  2 4 5 6 8  |  0 1 3 7 9  
  0 1 2 3 4 5 6 7 8 9

[editovat] Implementácia

function spoj(pole, lavy, pravy)
    tmp[pravy - lavy + 1]
    stred := (pravy + lavy) / 2
    koniecLavej := stred
    koniecPravej := pravy
    q := 1
    i := lavy
    j := stred + 1
    // kým sú v obidvoch poloviciach prvky
    while i <= koniecLavej and j <= koniecPravej
        // ak je prvý prvok (ešte nespracovaný) v prvej polovici
        // menší ako prvý takýto prvok v druhej, pridaj do pomocného 
        // poľa prvok z prvej, inak z druhej
        if pole[i] < pole[j]
            tmp[q] := pole[i]
            i := i + 1
        end if
        else
            tmp[q] := pole[j]
            j := 1 + 1
        end else
        q := q + 1
    end while
    // v jedenj z polovíc sa minuli prvky, prvky z polovice, 
    // v ktorej prvky ostali, pridá do pomocného poľa
    while i <= koniecLavej do
        tmp[q] := pole[i]
        q := q + 1
        i := i + 1
    end while

    while j <= koniecPravej do
        tmp[q] := pole[j]
        q := q + 1
        j := j + 1
    end while
    // utriedené prvky v pomocnom poli skopíruje naspäť 
    // do normálneho poľa
    for ii := lavy to pravy
        pole[ii] = tmp[ii - lavy + 1]
    end for
end function




function mergeSort(pole, lavy, pravy)
    if lavy < pravy
        stred := (lavy + pravy) / 2
        mergeSort(pole, lavy, stred)
        mergeSort(pole, stred+1, pravy)
        spoj(pole, lavy, pravy)
    end if
end function

Efektívnosť algoritmu je v značnej miere závislá na konkrétnej implementácií funkcie spoj, táto môže mať rôzne obmeny. Časová náročnosť algoritmu je O(n * log n), pamäťová je O(n) (existujú aj implementácie, ktoré nepotrebujú pomocné pole