我正在为课程实现快速排序功能。我们必须像她在课堂上用她的伪代码教我们一样,否则我们就不会得到荣誉。
我收到运行时错误,上面写着“ 围绕变量'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);
}
答案 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);
正如其他人所指出的,您的代码应使用更具描述性的名称。