C++11 merge sort implementation
Looks like a good bottom-up merge. A bit heavy on the memory at the first glance though.
if (a[0] &lt; b[0]) loses stability. The main advantage of the merge sort is is that it retains the order of elements which compare equal (for sorting integers it is irrelevant, but think of sorting structures). Your code merges b[0] first. Consider a[0] &lt;= b[0] instead.
Handling the unlikely conditions such as a.size() == 0 and b.size() == 0 better be done outside of the loop. Consider instead

while (a.size() &gt; 0 &amp;&amp; b.size() &gt; 0) {
    do_actual_merge();
}
ret.insert(ret.end(), a.begin(), a.end());  // No-op if a.size() == 0
ret.insert(ret.end(), b.begin(), b.end());  // No-op if b.size() == 0
return ret;

I am not sure that chunks.size() % 2 == 1 is the best way to express your intentions. I'd go for i &lt; chunks.size(), even though it lifts a declaration of i out of the loop.