You do not allocate memory in a function split:
void split( int* num, int n, int** left, int** right, int middle) {
left = #
right = &num + middle;
}
The above code is practically nothing useful: it changes its arguments, period. The arguments themselves do not go beyond calling the function.
Instead, you should select copies of the left and right halves of the array:
void split(int *num, int n, int **left, int **right, int middle) {
*left = malloc(middle * sizeof(**left));
memcpy(*left, num, middle * sizeof(**left));
*right = malloc((n - middle) * sizeof(**right));
memcpy(*right, num + middle, (n - middle) * sizeof(**right));
}
mergesort, N*log(N), .
: split , , :
void split(int *num, int n, int **left, int **right, int middle) {
*left = num;
*right = num + middle;
}
, left right , . , , merge, :
mergesort(num, middle);
mergesort(num + middle, n-middle);
left = malloc(middle * sizeof(*left));
memcpy(left, num, middle * sizeof(*left));
right = malloc((n - middle) * sizeof(*right));
memcpy(right, num + middle, (n - middle) * sizeof(*right));
merge(num, left, right, middle, n-middle);
free(left);
free(right);
: middle, , , (middle = (n+1) >> 1;), , , . , .
split, insert append merge. , . merge mergesort int* , void.
: insert() <= ( int, , ).