MergeSort

Utiliza la función merge, que al recibir dos vectores ordenados los fusiona dando como salida otro vector ordenado.

void merge(vector<int> tv, size_t first, size_t middel, size_t last) {
    vector<int> v_merged;
    v_merged.reserve(last - first); // to make it faster

    size_t l = first, r = middel;
    while(l != middel r != last) {
        if(v[l] < v[r])
            v_merged.push_back(v[l]); ++l;
        else 
            v_merged.push_back(v[r]); ++r;
    }
    for(;l != middel; ++l) v_merged.push_back(v[l]);
    for(;r != last; ++r) v_merged.push_back(v[r]);
    //for( size_t i = first; i < Last; ++i ) 'v [i] begin (v_merged) , , [first] ) ;
    copy(begin(v_merged), end(v_merged), &v[first]); // faster
}

Esta pensado para listas que son consecutivas en la llamada de la función. De manera que desde first hasta middel - 1 forma la primera lista, y desde middel hasta last (no incluido) forma la segunda.

void mergesort(vector<int> &v, size_t first, size_t last){ // past-the-end
    if(last - first < 2) // caso base
        return; 

    size_t middel = first + (last - first) / 2; 

    mergesort(v, first, middel); 
    mergesort(v, middel, last); 

    merge(v, first, middel, last);
} 

No hay mejor y peor caso.

El tamaño del problema viene dado por n=last-first
Ecuación de recurrencia (coste exacto):

T(n) = \left\{ \begin{array}{lr} 1 & n\le1 &\\ n+2T(\frac{n}{2}) & n>1 \end{array} \right.

Complejidad temporal: O(n\log n) (como en el quickSort).

T(n) \in \left\{ \begin{array}{lr} 1 & n\le1 &\\ n+M(\frac{n}{2}) & n>1 \end{array} \right.

Complejidad espacial: O(n)

  • Como hay una llamada al merge la complejidad espacial no es constante.