#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>
using namespace std;
template<typename T>
class comparator
{
public:
   bool operator()(const T & p, const  T & q) const
   {
        return p < q;
   }
};
template<typename E, typename C>
void mergeSort(vector<E> & S, const C & less)
{
   typedef vector<E> vect;
   int n=S.size();
   vect v1(S); vect * in=&v1;
   vect v2(n); vect * out=&v2;
   for(int m=1; m<n; m*=2)
   {
       for(int b=0; b<n; b+=2*m)
           merge(*in, *out, less, b, m);
       swap(in,out);
   }
   S=*in;
}
template<typename E, typename C>
void merge(vector<E> & in, vector<E>& out, const C & less, int b, int m)
{
   int k=b;
   int n=in.size();
   int key[4]={b, b+m, min(b+m,n), min(b+2*m,n)};
   while( ( key[0] < key[2] ) && ( key[1] < key[3] ) )
   {
       if(less(in[key[0]],in[key[1]]))
          out[k++]=in[key[0]++];
       else
          out[k++]=in[key[1]++];
   }
   for(int i=0; i!=2; ++i)
   {
       if( key[i] < key[i+2] )
           out[k++]=in[key[i]++];
   }
}          
int main()
{
    vector<int> V;
    comparator<int> cmp;
    int A[8]={3,-2,1,12,5,2,8,0};
    copy(A, A+8, back_inserter(V));
    mergeSort(V, cmp);
    vector<int>::iterator p;
    for(p=V.begin(); p!=V.end(); ++p)
        cout<<*p<<" ";
    cout<<endl;
    return 0;
}