Tu faci doar interclasarea a 2 siruri sortate, nu sortarea propriuzisa.
Daca sirurile a si b sunt sortate (iar sursa e implementata bine) ar trebui sa obtii un sir sortat.
Ideea e sa folosesti divide et impera:
void sort(int a[], int left, int right)
{
if (left == right) // un singur element este sortat
return;
// apelez recursiv pt prima respectiv a 2a jumatate a sirului
sort (a, left, (left + right) / 2);
sort (a, (left + right) / 2 + 1, right);
// acum cele 2 jumatati sunt sortate, deci le pot interclasa si obtin un sir sortat
interclasare (a, left, right);
}