快速排序错误:变量周围的堆栈已损坏?

时间:2013-03-17 01:33:55

标签: c++ quicksort corruption

我正在为课程实现快速排序功能。我们必须像她在课堂上用她的伪代码教我们一样,否则我们就不会得到荣誉。

我收到运行时错误,上面写着“ 围绕变量'quickArray'的堆栈已损坏

我玩了调试器,仍然无法弄清问题是什么。我认为它与我的Partition()函数有关,但我不确定。有人可以帮忙吗? Iv在下面发布了main(),QuickSort()和Partition()函数。

int main()
{


int quickArray[10] = { 5 ,99, 32, 4, 1, 12, 15 , 8, 13, 55};
int P = quickArray[0];
int R =quickArray[9];

QuickSort(quickArray,P,R);
return 0;

}

............................................... ...........................................

void QuickSort(int ar2[],int P, int R)
{
int Q;

if( P < R )
{
    Q =  Partition(ar2,P,R);
    QuickSort(ar2,P,Q-1);
    QuickSort(ar2,Q+1,R);
}

}

............................................... ............................................

int Partition(int ar2[],int P, int R)
{
int x = ar2[R];
int i = P-1;
int temp;

for(int j = P; j <= R-1; j++)
{
    if( ar2[j] < x  )
    {
        i = i +1;
        temp = ar2[i];
        ar2[i] = ar2[j];
        ar2[j] = temp;
    }

    temp = ar2[R];
    ar2[R] = ar2[i+1];
    ar2[i+1] = temp;
}

return (i+1);
}

3 个答案:

答案 0 :(得分:2)

您将错误的索引传递给QuickSort函数:

int P = quickArray[0];
int R =quickArray[9];

P和R是数组索引,在这种情况下应该是0和9,但是,您将第一个元素和最后一个元素作为索引传递给QuickSort,55(quickArray [9])超出了quickArray的索引范围,所以你得到了错误。

BTW:最好使用描述性变量名,P和R没有很好地表达它们在这种情况下的含义。您可以使用left,right和pivot分别替换R,R和Q,如QuickSort算法中所述。

答案 1 :(得分:2)

您传递的是数组的实际元素而不是索引,快速调试此方法的方法是cout位于QuickSort的顶部,如下所示:

void QuickSort(int ar2[],int P, int R)
{
   std::cout << "P: " << P << " R: " << R << std::endl ;
   ...
{p>以及cout来电后的Partition

  Q =  Partition(ar2,P,R);

  std::cout << "QS: Q= " << Q << std::endl ;

修复方法是从QuickSort调用main,如下所示:

 QuickSort(quickArray,0,9);

从长远来看,花一些时间调试器可以帮助您更快地发现这些错误。

答案 2 :(得分:0)

int P = quickArray[0];
int R = quickArray[9];

QuickSort(quickArray,P,R);

应该是这样的:

int arrStartIndex = 0;
int arrEndIndex   = 9;

QuickSort(quickArray, arrStartIndex , arrEndIndex);

正如其他人所指出的,您的代码应使用更具描述性的名称。