Code:
typedef vector<int> LIST; // LIST can be a vector of any comparable type

static LIST merge_sort(LIST &linp)
{
size_t i, width;

    LIST lout(linp.size()); // second list for output

    for(width = 1; width < linp.size(); width *= 2){ /* merge pass */
        for(i = 0; i < linp.size(); i += 2 * width){ /* merge sublists */
            merge_pair(lout, linp, i, min(i+width, linp.size()), min(i+2*width, linp.size()));
        }
        linp.swap(lout);    // swap lists (if optimized would swap ptrs)
    }
    return(linp);           // return sorted list
}   

static void merge_pair(LIST &lout, LIST &linp, size_t ileft, size_t iright, size_t iend)
{
size_t il = ileft;
size_t ir = iright;

/*  merge a pair of sublists */
 
    for (size_t iout = ileft; iout < iend; iout++){
        if (il < iright && (ir >= iend || linp[il] <= linp[ir]))
            lout[iout] = linp[il++];
        else
            lout[iout] = linp[ir++];
    }
}