当我尝试执行此代码时,代码在print_array
中的cout
语句执行之前就崩溃了。我不知道为什么!但是,如果我注释掉主函数中对mergesort
的调用,则print_array
执行良好。
#include<iostream>
using namespace std;
void print_array( int A[], int n)
{
int i;
cout<<"n Array elts:t";
for(i=0;i<n;i++) cout<<A[i]<<" ";
}
void mergesort(int A[], int beg, int end)
{
if(beg>end) return;
mergesort(A,beg,(beg+end)/2);
mergesort(A, ((beg+end)/2)+1, end);
int B[end-beg+1],i,j,k;
i=beg; j=(beg+end)/2;
k=0;
while(i<(beg+end)/2 && j<end)
{
if(A[i] < A[j]) B[k++]=A[i++];
else B[k++]=A[j++];
}
while(i<(beg+end)/2) B[k++]=A[i++];
while(j<end) B[k++]=A[j++];
for(i=beg; i<end; i++) A[i]=B[i];
}
int main()
{
int n=10;
int A[]={1,23,34,4,56,60,71,8,99,0};
print_array(A,n);
mergesort(A,0,n);
print_array(A,n);
}
更新:使用endl
将刷新输出,print_array
值将显示在屏幕上。除此之外,我出现seg错误的原因是我没有在mergesort
中包含相等性检查。这是更新后的代码:
#include<iostream>
using namespace std;
void print_array( int A[], int n)
{
int i;
cout<<"n Array elts:t";
for(i=0;i<n;i++) cout<<A[i]<<" ";
}
void mergesort(int A[], int beg, int end)
{
if(beg>=end) return;
mergesort(A,beg,(beg+end)/2);
mergesort(A, ((beg+end)/2)+1, end);
int B[end-beg+1],i,j,k;
i=beg; j=(beg+end)/2;
k=0;
while(i<(beg+end)/2 && j<end)
{
if(A[i] < A[j]) B[k++]=A[i++];
else B[k++]=A[j++];
}
while(i<(beg+end)/2) B[k++]=A[i++];
while(j<end) B[k++]=A[j++];
for(i=beg; i<end; i++) A[i]=B[i];
}
int main()
{
int n=10;
int A[]={1,23,34,4,56,60,71,8,99,0};
print_array(A,n);
mergesort(A,0,n);
print_array(A,n);
}
该代码并没有做它应该做的事情,但它不再给seg带来错误。谢谢大家!
查看mergesort
中的最后一行:您正在访问B
中从beg
到end
的元素,但B
是零索引的。这是一个问题;可能还有更多。
我的第一个想法是,这是一个堆栈损坏,当您调用其他方法时,它会导致"堆栈溢出"。尝试在GDB中获取更多信息,尝试编译以提高调试级别并关闭gcc的优化(即-g3-O0)。
此外,您可以使用"valgrind"软件查找腐败并将结果发布在此处。(很抱歉在此提出请求,但我无法发表评论)。