【发布时间】:2014-12-21 17:54:01
【问题描述】:
我在 C 中尝试了以下代码用于合并排序,但它最终给了我一个段错误。有人能找到错误吗?
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:OP 说它抛出了一个段错误。
-
你能告诉我们段错误发生在哪一行吗?并给我们一个引发段错误的输入示例?
-
mergesort是一个递归函数,具有非常大的堆栈帧 (4 * MAXLEN * sizeof(int));可能你的堆栈空间用完了。要验证这一点,请使用stack overflow checking 编译并重新测试。 -
您错过了
N <= 0,可能想查看1 == N的案例。 Ruud 指出了您的实现使用的内存量,让我补充一点,比输入大小更多的额外内存是浪费的。如果您不想修改某些内容,请让维护编码器/编译器知道:int mergesort(int const * unsorted, …。您的fill()副本 - 名称应反映您眼中的重要内容。使用tool 记录文档。
标签: c algorithm sorting mergesort