【发布时间】:2018-05-08 14:24:49
【问题描述】:
我已经用 C++ 编写了这个合并排序程序,但在运行代码后出现“分段错误(核心转储)”错误。即使没有编译错误。你能告诉我我在做什么错吗?在数组中输入时,它显示该错误。如果我将其更改为 push_back,则输入很好,但稍后在合并功能中,它会显示相同的错误。
//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;
}
【问题讨论】:
-
您可以随时使用自定义比较器进行
std::sort。 -
但是我正在学习归并排序算法
-
1) "即使没有编译错误。" 如果代码编译 - 并不意味着它运行正确。 2)
cin>>a[i];是未定义的行为,当a为空时。 3)“如果我将其更改为 push_back,则输入很好,但稍后在合并函数中,它显示相同的错误”然后,您的合并函数具有某种未定义的行为。您是否尝试过使用调试器单步执行您的代码? -
你应该学习调试,这是非常有用的技能:)
-
vectors 如果分配给不存在的元素,则不会自动展开。
标签: c++ linux sorting gcc mergesort