#include <iostream>
#include <chrono>
#include <algorithm>
#include <cstdlib>
using namespace std;

std::vector<int> generate()
{
	std::vector<int> vec(1500000);
 
    std::generate (vec.begin(), vec.end(), rand);
    std::transform(vec.begin(), vec.end(), vec.begin(),
                   std::bind2nd(std::modulus<int>(), 1000));
    return std::move(vec);
}

int cmp(const void *a, const void *b)
{
	return (*(int*)a) - (*(int*)b);
}

template<class F>
void measurement_time(F f)
{
	auto vec = generate();
	auto start = std::chrono::high_resolution_clock::now();
    f(vec);
    auto stop = std::chrono::high_resolution_clock::now();
    std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(stop - start).count() << "ms" << std::endl;
}

int main(int argc, char *argv[])
{
	for(int i = 0; i < 10; ++i)
	{
	    measurement_time([](std::vector<int>& vec)
	    {
	    	std::sort(vec.begin(), vec.end());
	    });
	    
	    measurement_time([](std::vector<int>& vec)
	    {
	    	qsort(&vec[0], vec.size(), sizeof(int), cmp);
	    });
	    
	    std::cout << std::endl;
	}
}