Ci sei quasi..
Allora nel main la chiamata a msort, lhai modificata quasi bene..
Almeno che non vuoi lavorare con le dimensioni dell'array, sarebbe opportuno modificare la chiamata con
codice:
 msort(a,0,n-1)
Poi nella funzione msort(dopo la modifica della chiamata nel main dovevi riadattare il tutto) non c'e bisogno di fare il controllo
codice:
 if(i+1==j)
perchè adesso questo controlla risulta errato(per la modifica della chiamata msort nel main). Basta che modifichi questa funzione con
codice:
void msort(int a[], int i, int j){

     int med;

        if(i<j){
            med=(i+j)/2;
            msort(a,i,med);
            msort(a,med+1,j);
            merge(a,i,med,j);
        }
}
(L'azione svolta nell' if eliminato si farà direttamente nella funzione merge)
Poi solo 2 precisazioni nella funzione merge: il k deve essere settato a zero(l'array c parte da zero); poi quando nelle ultime righe copi il vettore ordinato in a devi modificare il codice in :
codice:
for(k=inf;k<=sup;k++)
        a[k]=c[k-inf];
perchè copi in a (sup-inf) elementi di c (da 0 a sup-inf) però questi elementi sono quelli che in a occupano i posti da inf a sup
CIAO spero sono stato chiaro