CLRS的水壶问题

时间:2016-03-14 08:03:20

标签: c++ debugging vector

我在运行此代码时发现了分段错误。

#include <iostream>
#include <vector>
using namespace std;

void quicksort(vector<int>&,vector<int>&,int,int);
int partationR(vector<int>&,int,int);
int partationB(vector<int>&,int,int);
int main()
{
vector<int> R = {2,5,3,6,4,8,7,9};
vector<int> B = {8,1,2,5,7,3,6,9};
int p=B[0];
int q=10;
vector<int> RB;
RB.reserve( R.size() + B.size() );
RB.insert( RB.end(), R.begin(), R.end() );
RB.insert( RB.end(), B.begin(), B.end() );

cout<<":::::::::Original::::::::"<<endl;
for(int i=0;i<RB.size();i++)
    cout<<RB[i]<<" ";
cout<<endl;

quicksort(R,B,p,q);

cout<<":::::::::Sorted::::::::::"<<endl;
for(int i=0;i<RB.size();i++)
    cout<<RB[i]<<" ";
cout<<endl;
}

void quicksort(vector<int>& R, vector<int>& B, int p, int q)
{
    int r,s;
        r=partationR(R,p,q);
        s=partationB(B,p,q);
        quicksort(R,B,p,r);
        quicksort(R,B,r+1,q);
        quicksort(R,B,p,s);
        quicksort(R,B,s+1,q);
}

int partationR(vector<int>& R, int p, int q)
{
    int x=R[p];
    int i = 0;
    int j;
    for(j=i+1;j<q;j++)
    {
        if(R[j]<=x)
        {
            i=i+1;
            swap( R[i],R[j] );

        }
    }
    swap( R[i], R[p] );
    return i;
}

int partationB(vector<int>& B, int p, int q)
{
    int y = B[p];
    int k = 0;
    int l;
    for(l=k+1;l<q;l++)
    {
        if (B[k]<=y)
        {
            k=k+1;
            swap( B[k],B[l] );
        }
    }
    swap( B[k],B[p] );
    return k;
}

GDB的输出

(gdb) c
Continuing.
:::::::::Original::::::::
2 5 3 6 4 8 7 9 8 1 2 5 7 3 6 9 

Program received signal SIGSEGV, Segmentation fault.
0x00000000004014e6 in std::vector<int, std::allocator<int> >::operator[] (
this=<error reading variable: Cannot access memory at address      0x7fffff7feff8>, 
__n=<error reading variable: Cannot access memory at address     0x7fffff7feff0>)
    at /usr/include/c++/5/bits/stl_vector.h:779
779       operator[](size_type __n) _GLIBCXX_NOEXCEPT
(gdb) kill

1 个答案:

答案 0 :(得分:0)

您的算法中存在一些奇怪的内容,您正在排序 R B ,然后将 RB 视为已排序。可能你想要排序 RB ?或者想分别排序 R B 然后插入 RB

无论如何,分段错误通常指向越界数据访问,即在这种情况下,错误地计算访问向量元素的位置。可能的误算之一:

int p=B[0]; //=8
...
//quicksort(R,B,p,q); -> partationB(B,p,q);
int y = B[p]; // = B[8], however size of B is 8    

q 类似。所以,看起来应该只是简单地说:

int p=0;
int q=7;

因为它们应该是矢量分区的初始索引。