合并排序代码中的分段错误

Segmentation fault in merge sort code

本文关键字:分段 错误 排序 代码 合并      更新时间:2023-10-16

我已经用 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;
}

无论您使用[]访问向量中的元素,都可能会遇到 seg 错误。 这段代码,

vector <int> a;

给你一个空的向量。

如果a里什么都没有,要求a[0]是行不通的。 尝试将a[0]设置为值也不起作用。 它不存在。 还。

当您使用mergeSort

vector <int> l, r;

这些也是空向量。

您可以使用push_back(甚至emplace_back(来添加新元素。 或者使用构造函数重载来声明所需的元素数。 例如

vector <int> a(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;
}

希望这有帮助。干杯。

以下是更改后的最终代码:

//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;
}