合并排序代码中的分段错误 我在C++中编写了这个合并排序程序,但是在运行代码后,我得到了“分割错误(内核转储)”错误。即使没有编译错误。你能告诉我我犯了什么错误吗?在数组中获取输入时,它会显示该错误。如果我将其更改为push_back,则输入很好,但稍后在merge函数中,它会显示相同的错误 //merging 2 sorted subarrays. #include <iostream> #include <vector> using namespace std; void merge(vector <int> &a,vector <int> &b,vector <int> &c) { int i=0,j=0,k=0,bL=b.size(),cL=c.size(); while(i<bL && j<cL) { if(b[i]<c[j]) { a[k]=b[i]; i++;k++; } else { a[k]=c[j]; j++;k++; } } while(i<bL) { a[k]=b[i]; i++;k++; } while(j<cL) { a[k]=c[j]; j++;k++; } cout<<"array a inside merge is: "<<endl; for(int p=0;p<a.size();p++) { cout<<a[p]<<endl; } } void mergeSort(vector <int> &a) { vector <int> l, r; int mid; if(a.size()<2) return; mid = a.size()/2; for(int i=0;i<mid;i++) { l[i]=a[i]; } for(int i=mid;i<a.size();i++) { r[i-mid]=a[i]; } mergeSort(l); mergeSort(r); merge(a, l, r); } int main() { int n; vector <int> a; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } mergeSort(a); for(int p=0;p<n;p++) { cout<<a[p]<<endl; } return 0; } //合并2个已排序的子数组。 #包括 #包括 使用名称空间std; 无效合并(向量和a、向量和b、向量和c) { int i=0,j=0,k=0,bL=b.size(),cL=c.size(); 而(i
当您使用合并排序代码中的分段错误 我在C++中编写了这个合并排序程序,但是在运行代码后,我得到了“分割错误(内核转储)”错误。即使没有编译错误。你能告诉我我犯了什么错误吗?在数组中获取输入时,它会显示该错误。如果我将其更改为push_back,则输入很好,但稍后在merge函数中,它会显示相同的错误 //merging 2 sorted subarrays. #include <iostream> #include <vector> using namespace std; void merge(vector <int> &a,vector <int> &b,vector <int> &c) { int i=0,j=0,k=0,bL=b.size(),cL=c.size(); while(i<bL && j<cL) { if(b[i]<c[j]) { a[k]=b[i]; i++;k++; } else { a[k]=c[j]; j++;k++; } } while(i<bL) { a[k]=b[i]; i++;k++; } while(j<cL) { a[k]=c[j]; j++;k++; } cout<<"array a inside merge is: "<<endl; for(int p=0;p<a.size();p++) { cout<<a[p]<<endl; } } void mergeSort(vector <int> &a) { vector <int> l, r; int mid; if(a.size()<2) return; mid = a.size()/2; for(int i=0;i<mid;i++) { l[i]=a[i]; } for(int i=mid;i<a.size();i++) { r[i-mid]=a[i]; } mergeSort(l); mergeSort(r); merge(a, l, r); } int main() { int n; vector <int> a; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; } mergeSort(a); for(int p=0;p<n;p++) { cout<<a[p]<<endl; } return 0; } //合并2个已排序的子数组。 #包括 #包括 使用名称空间std; 无效合并(向量和a、向量和b、向量和c) { int i=0,j=0,k=0,bL=b.size(),cL=c.size(); 而(i,c++,linux,sorting,gcc,mergesort,C++,Linux,Sorting,Gcc,Mergesort,当您使用[]访问向量中的元素时,可能会出现seg故障。 这个代码 vector <int> a; 这些也是空向量 您可以使用push_back(甚至emplace_back)添加新元素。 或者使用来说明需要多少元素。 比如说, vector <int> a(10); 向量a(10); 为您提供一个10整数的向量,因此,a[0]可以读取或写入。 a[11]不是 首先练习使用向量,然后尝试合并排序。出现分段错误的原因是您访问的内存位置不存在(更准确地说是未分配)。如果您
[]
访问向量中的元素时,可能会出现seg故障。
这个代码
vector <int> a;
这些也是空向量
您可以使用push_back
(甚至emplace_back
)添加新元素。
或者使用来说明需要多少元素。
比如说,
vector <int> a(10);
向量a(10);
为您提供一个10整数的向量,因此,a[0]
可以读取或写入。
a[11]
不是
首先练习使用向量,然后尝试合并排序。出现分段错误的原因是您访问的内存位置不存在(更准确地说是未分配)。如果您有一个长度为3的向量,并且尝试访问第4个位置,则会出现分段错误 与@doctorlove的答案相反,我想说可以使用
[]
。但是,您需要以下实现(仅针对main()
,请在其他函数中使用相同的逻辑实现)。有关更多信息,请参阅std::vector
的文档
int main()
{
size_t n;
std::cin >> n;
std::vector <int> a(n);
for(int i=0;i<n;++i)
{
std::cin >> a[i];
}
// mergeSort(a);
for(int i=0;i<n;++i)
{
std::cout << a[i] << "\n";
}
return 0;
}
intmain()
{
尺寸;
标准:cin>>n;
std::载体a(n);
对于(int i=0;i>a[i];
}
//合并(a);
对于(int i=0;i以下是更改后的最终代码:
//merging 2 sorted subarrays.
#include <iostream>
#include <vector>
using namespace std;
void merge(vector <int> &a,vector <int> &b,vector <int> &c)
{
int i=0,j=0,k=0,bL=b.size(),cL=c.size();
while(i<bL && j<cL)
{
if(b[i]<c[j])
{
a[k]=b[i];
i++;k++;
}
else
{
a[k]=c[j];
j++;k++;
}
}
while(i<bL)
{
a[k]=b[i];
i++;k++;
}
while(j<cL)
{
a[k]=c[j];
j++;k++;
}
cout<<"array a inside merge is: "<<endl;
for(int p=0;p<a.size();p++)
{
cout<<a[p]<<endl;
}
}
void mergeSort(vector <int> &a)
{
vector <int> l, r;
int mid;
if(a.size()<2) return;
mid = a.size()/2;
for(int i=0;i<mid;i++)
{
l.push_back(a[i]);
}
//change2
for(int i=0;i<a.size()-mid;i++)
{
r.push_back(a[mid+i]);
}
mergeSort(l);
mergeSort(r);
merge(a, l, r);
}
int main()
{
int n;
cin>>n;
//change1
vector <int> a(n);
for(int i=0;i<n;i++)
{
cin>>a[i];
}
mergeSort(a);
cout<<"Final array is:"<<endl;
for(int p=0;p<n;p++)
{
cout<<a[p]<<endl;
}
return 0;
}
//合并2个已排序的子数组。
#包括
#包括
使用名称空间std;
无效合并(向量和a、向量和b、向量和c)
{
int i=0,j=0,k=0,bL=b.size(),cL=c.size();
虽然(iYou总是可以使用自定义比较器执行std::sort
,但我正在学习合并排序算法1)“即使没有编译错误。”如果代码编译,并不意味着它运行正确。2)cin>>a[I];
是未定义的行为,当a
为空时。3)“如果我将其更改为push_back,输入很好,但后来在merge函数中,它显示了相同的错误”然后,您的merge函数有一些未定义的行为。您是否尝试过使用调试器单步执行代码?您应该学习去bug,这是非常有用的技能:)vector
s如果指定给不存在的元素,则不会自动展开。但我不是要[0],相反,我在那个位置接受输入?所以,即使它不起作用?而且,push_back在合并中也不起作用,因为每次我都必须从0开始,所以如果我按下,它不会覆盖。我会更明确-您试图将某个内容放在索引0中。但是没有空间。还要注意使用++I
而不是I++
。增量前和增量后都很重要。谢谢,但我尝试过这样做,输入变得正确,但在某些函数中再次出现相同的错误,我在所有向量声明中都应用了这一点。请记住,一般来说,您可能不会遇到seg错误。访问inavlid内存是一种未定义的行为。这是您可以解决的问题调试。尝试在每个函数中一步一步地注释和取消注释部分代码。这样,您将知道您在哪里遇到了分段错误。这就是我为main()所做的
。我相信我已经给出了足够的答案,让您从主要答案中找出完整的解决方案。预期的结果将是合并函数当前工作的数组部分。通过多次迭代,它将最终收敛,形成排序数组!
//merging 2 sorted subarrays.
#include <iostream>
#include <vector>
using namespace std;
void merge(vector <int> &a,vector <int> &b,vector <int> &c)
{
int i=0,j=0,k=0,bL=b.size(),cL=c.size();
while(i<bL && j<cL)
{
if(b[i]<c[j])
{
a[k]=b[i];
i++;k++;
}
else
{
a[k]=c[j];
j++;k++;
}
}
while(i<bL)
{
a[k]=b[i];
i++;k++;
}
while(j<cL)
{
a[k]=c[j];
j++;k++;
}
cout<<"array a inside merge is: "<<endl;
for(int p=0;p<a.size();p++)
{
cout<<a[p]<<endl;
}
}
void mergeSort(vector <int> &a)
{
vector <int> l, r;
int mid;
if(a.size()<2) return;
mid = a.size()/2;
for(int i=0;i<mid;i++)
{
l.push_back(a[i]);
}
//change2
for(int i=0;i<a.size()-mid;i++)
{
r.push_back(a[mid+i]);
}
mergeSort(l);
mergeSort(r);
merge(a, l, r);
}
int main()
{
int n;
cin>>n;
//change1
vector <int> a(n);
for(int i=0;i<n;i++)
{
cin>>a[i];
}
mergeSort(a);
cout<<"Final array is:"<<endl;
for(int p=0;p<n;p++)
{
cout<<a[p]<<endl;
}
return 0;
}