我似乎在让这个mergesort运行时遇到了一些麻烦。当我尝试用g ++运行它时终端说“分段错误(核心转储)”,我不知道是什么导致这种情况发生(你可能会告诉我我还是初学者)。有人可以帮忙吗?
#include <iostream>
using namespace std;
void merge (int*, int, int, int);
void mergesort (int* A, int p, int r){
if (p < r){
int q = (p+r)/2;
mergesort (A, p, q);
mergesort (A, q+1, r);
merge ( A, p , q, r);
}
}
void merge (int* A, int p, int q, int r){
int n = q-p+1;
int m = r-q ;
int L [n+1];
int R [m+1];
for (int i=1;i <n+1;i++)
L[i] = A[p+i-1];
for (int j=1; j< m+1; j++)
R[j] = A[q+j];
L[n+1];
R[m+1];
int i= 1;
int j=1;
for (int k = p; k= r + 1; k++){
if (L[i] <= R[j]){
A[k] = L[i];
i+=1;
}
else{
j += 1;
}
}
}
int main() {
int A [15] = {1, 5, 6, 7,3, 4,8,2,3,6};
mergesort (A, 0, 9);
for (int i=0; i <9; i++){
cout << A[i] << endl;
}
return 0;
}
非常感谢!
答案 0 :(得分:2)
您的实施中有三件事情要么没有意义,要么完全错误:
首先是这些:
L[n+1];
R[m+1];
这些陈述都没有任何影响,我也不知道你要做什么。
接下来,一个重要的错误:
for (int k = p; k= r + 1; k++){
此for循环的条件子句是赋值 k = r + 1
。由于r
不会在循环中的任何位置发生变化,因此表达式false
的唯一方式是r == -1
,它永远不会。你刚刚在一个计数器k
上创建了一个无限循环,它将永远运行到平流层,并在进程索引和写入内存中不再有效。因此,这是未定义的行为。我很确定你想要这个:
for (int k = p; k< (r + 1); k++){
虽然我无法评论这是否是有效限制,因为我没有进一步剖析你的算法。我没有花时间进一步调试这个。我留给你了。
修改即可。在你的主要mergsesort中,这不是“错误的”但很容易溢出
int q = (p+r)/2;
请考虑一下:
int q = p + (r-p)/2;
而且最重要的是:
int L [n+1];
int R [m+1];
使用C ++标准不支持的可变长度数组扩展。您可能希望使用std::vector<int> L(n+1)
等。而不是。
答案 1 :(得分:0)
在您的情况下,当您尝试读取变量中不存在的内存时,可能会导致分段错误,例如假设您有一个名为foo且大小为10的数组(所以foo[10]
)和你这句话foo[11]
会导致分段错误。
您需要做的是使用调试语句打印出索引变量(i,j,n,m,p和q)并查看其中是否有任何大于数组大小
编辑:另一个不相关的问题是你不应该使用using namespace std
,如果你不小心,这行代码可能会导致范围问题,只需要记住:)