Recursively splits the array in half like standard Merge sort, but uses two full-size buffers that alternate roles at every recursion level, one buffer is the source (ping) and the other is the destination (pong), swapping at each recursive call.
Eliminating the copy-back step of standard Merge sort reduces writes from 1.5n per level to n per level, roughly 33% fewer total writes for large arrays. The result always surfaces in the original array so no final copy-back is needed.