void s (int x[], int y, int l[], int k, int r[], int q) { int i; for (i = 0; i < k; i++) l[i] = x[i]; for (i = k; i < y; i++) r[i-k] = x[i]; } void m (int x[], int y, int l[], int k, int r[], int q) { int a = 0; int b = 0; int c = 0; while ((a < k) && (b < q)) x[c++] = (l[a] < r[b]) ? l[a++] : r[b++]; while (a < k) x[c++] = l[a++]; while (b < q) x[c++] = r[b++]; } int h (int x[], int y) { int k = y/2; int q = y - k; int l[k]; int r[q]; if (y <= 1) return y; s (x, y, l, k, r, q); h (l, k); h (r, q); m (x, y, l, k, r, q); return k + q; }