#include #include extern int registerme ( int ); extern void startsort ( ); extern int compareballs ( int, int ); extern void verifysort ( int * ); extern void startmatch ( int ); extern int fitsin ( int i, int j ); extern void verifymatch ( int * ); void mergesort ( int *S, int n, int *ncall ) { int m, i, j, k; int *T; if (n <= 1) return; m = n/2; mergesort(S,m,ncall); mergesort(S+m,n-m,ncall); T = (int *)malloc(n * sizeof(int)); i = 0; j = m; k = 0; while ((i < m) || (j < n)) { if (i >= m) T[k++] = S[j++]; else if (j >= n) T[k++] = S[i++]; else { if (compareballs(S[i],S[j]) < 0) T[k++] = S[i++]; else T[k++] = S[j++]; ++(*ncall); } } for (k=0; k 0) TG[g++] = T[i]; else TL[l++] = T[i]; } /* Now, partition S usiing T[P] as pivot */ l = g = 0; for (i=1; i 0) SL[l++] = S[i]; else SG[g++] = S[i]; } /* Write back the temporary arrays to the original arrays */ /* The pivots are in position */ T[l] = T[P]; S[l] = S[0]; /* The smaller items are placed before the pivot */ for (i=0; i