Is this an efficient way to implement Merge Sort in C++?
A single most important property of a merge sort is stability: equal elements maintain their relative order. This

    *pr++ = (*p1 &lt; *p2) ? *p1++ : *p2++;


is a very typical mistake. In case *p1 == *p2, the element will be merged from the second array. Stability is lost. Not a problem for integers, of course, but keep in mind. The fix is simple:

    *pr++ = (*p2 &lt; *p1) ? *p2++ : *p1++;