Я пробовал следующий код в C для mergesort, но он просто заканчивается тем, что дает мне segfault. Может ли кто-нибудь найти ошибку?Почему этот алгоритм слияния не работает?
int mergesort(int* unsorted, int* sorted, int N) {
if (N==1) {
*unsorted=*sorted;
return 1;
}
else {
int left[MAXLEN];
int right[MAXLEN];
int sleft[MAXLEN];
int sright[MAXLEN];
int k1 = fill(unsorted,left,0,N/2);
int k2 = fill(unsorted,right,N/2,N);
int l1 = mergesort(left,sleft,k1);
int l2 = mergesort(right,sright,k2);
merge(sorted,sleft,sright,l1,l2);
return N;
}
}
void merge(int* sorted,int* left,int* right,int N1,int N2) {
int i1=N1;
int i2=N2;
while ((i1!=0) || (i2!=0)) {
if (i1==0) {
while ((i2--)!=0)
*sorted++=*right++;
}
else if (i2==0) {
while ((i1--)!=0)
*sorted++=*left++;
}
else {
if (*left < * right) {
*sorted++=*left++;
i1--;
}
else {
*sorted++=*right++;
i2--;
}
}
}
}
Функция заполнения реализована следующим образом
int fill(int* from, int* to, int left, int right) {
int i = left;
from += i;
while (i<right) {
*to++=*from++;
i++;
}
return (right-left);
}
Может кто-нибудь объяснить, является ли это ошибка, или я не обрабатывается должным образом выделение памяти?
@hatchet: ОП сказал, что он выбрасывает segfault. – LarsH
Можете ли вы рассказать нам, в какой строке происходит segfault? и дать нам пример ввода, на который он выдает segfault? – LarsH
'mergesort' - рекурсивная функция с очень большим фреймом стека (' 4 * MAXLEN * sizeof (int) '); возможно, у вас закончилось пространство стека. Чтобы проверить это, выполните компиляцию с помощью [проверки переполнения стека] (https://gcc.gnu.org/onlinedocs/gnat_ugn/Stack-Overflow-Checking.html) и повторной проверки. –