C++合并排序代码中的隔离错误
Segfault in C++ merge sort code
试图让它工作。GDB 似乎表明索引可能由于某种原因而关闭。我正在使用一个名为 Record 的子类向量,主要包含需要双向排序的人口 (int) 和名称(字符串)。bt 表示第 27 行的空指针,它是 isSmall() 函数中的 'if' 语句。此函数与同一程序中的插入排序代码配合使用,但不能与合并排序配合使用,所以我想知道合并排序代码有什么问题。请指教。算法有问题吗?
BT 返回以下内容:
#0 0x0000000000403160 in CensusData::isSmaller (this=0x7fffffffdd10, type=0, r1=0x609590, r2=0x0) at CensusDataSorts.cpp:27
#1 0x0000000000403510 in CensusData::mergeIt (this=0x7fffffffdd10, type=0, list=..., p=0, q=1, r=2) at CensusDataSorts.cpp:96
#2 0x0000000000403347 in CensusData::mergeSortIt (this=0x7fffffffdd10, type=0, list=..., p=0, r=2) at CensusDataSorts.cpp:70
#3 0x0000000000403645 in CensusData::mergeSort (this=0x7fffffffdd10, type=0) at CensusDataSorts.cpp:113
#4 0x0000000000401a50 in runMergeSorts (fp=...) at CensusSort.cpp:106
#5 0x0000000000401e6f in main (argc=2, argv=0x7fffffffe068) at CensusSort.cpp:174
代码如下所示
bool CensusData::isSmaller(int type, Record* r1, Record* r2)
{
if(type==POPULATION)
{
if(r1->population <= r2->population)
return true;
}
else if(type==NAME)
{
if(*(r1->city) <= *(r2->city))
return true;
}
return false;
}
void CensusData::mergeSortIt(int type, vector<Record*>& list, int p, int r)
{
if(p < r)
{
int q = floor((p+r)/2);
mergeSortIt(type,list,p,q);
mergeSortIt(type,list,q+1,r);
mergeIt(type,list,p,q,r);
}
}
void CensusData::mergeIt(int type, vector<Record*>& list, int p, int q, int r)
{
int n1=q-p+1;
int n2=r-q;
int i,j;
vector<Record*> L(n1,0);
vector<Record*> R(n2,0);
for(i=0; i<n1; i++)
L[i]=list[p+i];
for(j=0; j<n2; j++)
R[j]=list[q+j+1];
i=0;
j=0;
for(int k=p; k<=r; k++)
{
if(isSmaller(type,L[i],R[j]))
{
list[k]=L[i];
i++;
}
else
{
list[k]=R[j];
j++;
}
}
}
void CensusData::mergeSort(int type)
{
mergeSortIt(type, data, 0, data.size()-1);
}
问题在于重写合并记录的方式:
for(int k=p; k<=r; k++)
{
// Here i or j can be outside L/R bounds
if(isSmaller(type,L[i],R[j]))
{
list[k]=L[i];
i++;
}
else
{
list[k]=R[j];
j++;
}
}
这是重写的版本:
int k=p;
for(; k<=r; k++)
{
if(isSmaller(type,L[i],R[j]))
{
list[k]=L[i];
i++;
if ( i == L.size() )
break;
}
else
{
list[k]=R[j];
j++;
if ( j == R.size() )
break;
}
}
for ( ; i < L.size(); ++i )
list[k++]=L[i];
for ( ; j < R.size(); ++j )
list[k++]=R[j];
我不确定这是否使您的程序按预期工作,但它应该修复您的段错误。
r2=0x0) at CensusDataSorts.cpp:27,即你有一个空指针。
同时将比较更改为:
return r1->population < r2->population;
和
return *(r1->city) < *(r2->city);
否则就没有意义了。你不能有 <= 让它在逻辑上是正确的。事实上,由于比较不当,我自己也遇到了排序崩溃。
相关文章:
- 从矢量中删除元素后出现隔离错误
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 线程时访问静态映射时出现隔离错误
- 并行快速排序分区中的隔离错误
- C++多线程程序:变量定义为类成员的隔离错误
- TFLite 隔离错误,通过获取C++输入和输出
- 我只是在寻找模板,在我的书中找到了这段代码,这显示了隔离错误?
- pthread_create中错误 4 的隔离错误
- 递归树遍历/分支删除的隔离错误
- 在类模板上使用 arm gcc 编译期间的隔离错误
- 从大量文件读取时出现隔离错误
- 在PHP扩展中使用emalloc从线程时出现隔离错误
- 通过 Boost Python 在C++对象之间传递共享指针的隔离错误
- 在QT中单击菜单时出现隔离错误
- 尝试访问标头声明成员时出现隔离错误
- 搜索链表时出现隔离错误
- 模板化子类析构函数中的隔离错误
- 插件中节点.js/Nan 回调C++不频繁的隔离错误
- 将行添加到 GTKTreeView 时的隔离错误
- 找不到命令时打开的隔离错误