合并排序代码中的分段错误 我在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;
}