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

时间:2018-05-08 14:24:50

标签: c++ linux sorting gcc mergesort

我用c ++编写了这个合并排序程序,但运行代码后出现“Segmentation fault(core dumped)”错误。即使没有编译错误。你能告诉我我在做什么错吗?在数组中输入时,它显示错误。如果我将其更改为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;
}

3 个答案:

答案 0 :(得分:1)

使用[]访问向量中的元素时,可能会出现seg错误。 这段代码,

vector <int> a;

给你一个空矢量。

如果a[0]中没有任何内容,请求a将无效。 尝试将a[0]设置为值也不起作用。 它不存在。 爱好。

使用

时,mergeSort出现类似问题
vector <int> l, r;

这些也是空载体。

您可以使用push_back(甚至emplace_back)添加新元素。 或者使用constructor overload来说明您想要的元素数量。 例如,

vector <int> a(10);

为您提供了十个整数的向量,因此a[0]可以读取或写入。 a[11]不是。

首先练习使用矢量然后尝试合并排序。

答案 1 :(得分:0)

获得分段错误的原因是您访问了不存在的内存位置(更准确地说是未分配)。假设您有一个长度为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;
}

希望这会有所帮助。欢呼声。

答案 2 :(得分:0)

这是更改后的最终代码:

$("#container").on("click", "li", function(e) {
  var links = [];
  $(this).find("img").each(function() {
    links.push($(this).attr("src"));
  });
  console.log(links);
});
相关问题