问题描述
下面的代码用于执行合并排序。向量已正确排序。我已经通过了size_t类型的引用变量num传递了。在作为参考传递之前,此变量已初始化为零。在指定位置访问变量会导致分段故障核心转储。但是,在merge_sort函数的其他部分中访问它不会导致任何错误并给出预期的结果。 很少有人尝试过在同一行代码之前未引起任何错误,但突然间它开始引起分段错误核心转储。 我想知道为什么会这样。
#include<iostream>
#include<vector>
#include<cstdlib>
#define N_LIM 5
#define NUM_LIM 5
using namespace std;
size_t naive(vector<int> &a)
{
size_t i=0,j=0,l=a.size()-1,k=0;
for(i=0;i<l;i++)
for(j=i+1;j<=l;j++)
if(a[i]>a[j])
k++;
return k;
}
void merge_sort(vector<int> &a,size_t m,size_t n,size_t &num,vector<int> &temp)
{
if(m<n)
{
size_t l=(m+n)/2,ans=0;
merge_sort(a,m,l,num,temp);
merge_sort(a,l+1,n,temp);
size_t p=m,q=l+1,r=m;
while(p<=l && q<=n)
{
if(a[p]<=a[q])
{
temp[r]=a[p];
r++;
p++;
}
else
{
temp[r]=a[q];
r++;
q++;
//num=num+l-p+1; causes segmentation fault num has been initialised to zero before 1st call to merge_sort
ans+=l-p+1;
}
}
while(p<=l)
{
temp[r]=a[p];
p++;
r++;
}
while(q<=n)
{
temp[r]=a[q];
r++;
q++;
}
for(size_t i=m;i<r;i++)
a[i]=temp[i];
// num=444; num can be accessed here without any problem
}
}
size_t inversion(vector<int> &a,bool f=0)
{
size_t num=0;
vector<int> temp(a.size());
merge_sort(a,a.size()-1,temp);
if(f==1)
{
for(size_t i=0;i<a.size();i++)
cout<<a[i]<<" ";
cout<<endl;
}
return num;
}
int stress_test()
{
int n=rand()%N_LIM;
vector<int> a(n),b(n);
for(size_t i=0;i<n;i++)
a[i]=b[i]=rand()%NUM_LIM;
size_t ans1=naive(a);
size_t ans2=inversion(a);
if(ans1==ans2)
return 0;
else
{
cout<<"Input :";
for(size_t i=0;i<n;i++)
cout<<" "<<b[i];
cout<<endl<<"Output :";
for(size_t i=0;i<n;i++)
cout<<" "<<a[i];
cout<<endl<<"Ans_Naive = "<<ans1<<"\t"<<"Ans = "<<ans2<<endl;
return 1;
}
}
int main(void)
{
size_t z=0;
while(++z<1000)
{
if(stress_test()==1)
break;
}
size_t n=0;
cin>>n;
vector<int> a(n);
for(size_t i=0;i<n;i++)
cin>>a[i];
size_t k=inversion(a,1);
cout<<k<<endl;
return 0;
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)