void merge(int *a, int s1, int e1, int s2, int e2, int *c) {
int i, j, t;
i = s1;
j = s2;
t = 0;
while (i < e1 && j < e2) {
if (a[i] < a[j]) {
c[t++] = a[i++];
} else {
c[t++] = a[j++];
}
}
while (i < e1) {
c[t++] = a[i++];
}
while (j < e2) {
c[t++] = a[j++];
}
}
void mergeSort(int *cache, int *a, int st, int ed) {
if (st < ed) {
int mid = (st + ed) >> 1;
mergeSort(cache, a, st, mid);
mergeSort(cache, a, mid + 1, ed);
merge(a, st, mid, mid + 1, ed, cache);
int i, t = 0;
for (i = st; i <= ed; ++i) {
a[i] = cache[t++];
}
}
}