Вы не можете вычислить размер массивов, переданных в качестве параметров с помощью int nl = sizeof(l) / sizeof(l[0]);
, потому что sizeof(l)
- это размер указателя на int
, а не размер массива. sizeof(l)
оценивает размер массива только тогда, когда определение массива находится в области действия.
Вы должны явно передавать размеры в качестве аргументов.
Также измените вычисление для mid
: int mid = n / 2;
Вот модифицированная версия:
#include <stdio.h>
void merge(int a[], int l[], int nl, int r[], int nr);
void merge_sort(int a[], int n) {
if (n < 2) {
return;
} else {
int i;
int mid = n / 2;
int l[mid], r[n - mid];
for (i = 0; i < mid; i++) {
l[i] = a[i];
}
for (i = mid; i < n; i++) {
r[i - mid] = a[i];
}
merge_sort(l, mid);
merge_sort(r, n - mid);
merge(a, l, mid, r, n - mid);
}
}
void merge(int a[], int l[], int nl, int r[], int nr) {
int i = 0;
int j = 0;
int k = 0;
while (i < nl && j < nr) {
if (l[i] <= r[j]) {
a[k] = l[i];
i++;
} else {
a[k] = r[j];
j++;
}
k++;
}
while (i < nl) {
a[k] = l[i];
i++;
k++;
}
while (j < nr) {
a[k] = r[j];
j++;
k++;
}
}