0

我正在为一项任务实施堆排序。我们必须像她在课堂上用她的伪代码那样做,否则我们不会得到荣誉。

我收到运行时错误:围绕变量“heapArray”的堆栈已损坏。我玩了调试器,但仍然无法找出导致错误的原因。我很确定这与我在 HeapSort() 函数中的 For 循环有关。任何人都可以帮忙吗?

void HeapSort(int heapArray[])
{   
    int heap_size = SIZE;
    int n = SIZE;
    int temp;

    Build_Max_Heap(heapArray);//function not implemented, only declared for compile

    for(int i = n; i >=2; i--) //***I think error coming from something in here
    {
        temp = heapArray[1];
        heapArray[1] = heapArray[i];
        heapArray[i] = temp;

        heap_size = heap_size-1;
        Max_Heapify(heapArray,1);//function not implemented, only declared for compile
    }

    return;
}

int main()
{
    int heapArray[SIZE] = {  5 ,99, 32, 4, 1, 12, 15 , 8, 13, 55 };
    HeapSort(heapArray);


    cout << endl;
    return 0;
}
4

2 回答 2

0

你写的越界

for(int i = n; i >=2; i--) 
{
temp = heapArray[1];
heapArray[1] = heapArray[i];  //THIS IS WRONG
heapArray[i] = temp;          //

在 c 中,数组从 0 到 n-1。heapArray 声明为大小为 SIZE。

应该更像:

for(int i = n - 1; i >=2; i--) //Now you start from n-1
{
temp = heapArray[1];
heapArray[1] = heapArray[i];
heapArray[i] = temp; 
于 2013-03-17T21:25:02.377 回答
0

错误是:

for(int i = n; i >=2; i--) 

您必须从数组索引开始,n-1因为数组索引从 0 开始。正确的做法应该是

for(int i = n -1; i >=1; --i)

如果从 . 开始,数组索引超出范围错误n。您书中的伪代码(为了方便起见)很可能使用从 1 到 的数组索引n,但在使用 C++ 的实际程序中,我们应该从 0 到开始n-1

于 2013-03-17T21:25:06.523 回答