Recurrent merge sort (without recursion)
I see a number of things that may help you improve your code.

Rearrange the code to reduce the need for declarations

A function declaration is only needed by the compiler if it hasn't already encountered the function itself.  With that said, if the functions in the file are in the order check_sort, merge, merge_sort and then main, no separate function declarations would be needed.

Separate I/O from logic

The check_sort routine is not bad as it is, but I'd advocate separating the I/O from the logic.  That is, rename check_sort to is_sorted and have it return a bool value of true only if the vector is sorted.  Leave the printing to the calling function instead.

Use const where practical

The check_sort function does not alter the passed vector, so that should be passed as const &amp;:

void check_sort(const std::vector&lt;int&gt; &amp;array)


Consider using references

While this code works, there is still some room for improvement.  The easy thing to do to speed up the code is to simply use references like this:

std::vector&lt;int&gt; merge(std::vector&lt;int&gt; &amp;array, unsigned int b, unsigned int c, unsigned int e) {


By having it &amp;array instead of array you tell the compiler that it may use the passed object directly rather than making a copy.  This single change makes the code run about twice as fast on my machine.

Omit return 0

When a C++ program reaches the end of main the compiler will automatically generate code to return 0, so it is not necessary to put return 0; explicitly at the end of main.

There's more, but that's all I have time for at the moment.