Ошибка сортировки кучи: стек вокруг переменной был поврежден?

Я реализую Heap Sort для задания. Мы должны сделать это так же, как она делала в классе со своим псевдокодом, иначе мы не получим зачет.

Я получаю сообщение об ошибке времени выполнения: Стек вокруг переменной heapArray был поврежден. Я игрался с отладчиком и так и не смог понять, что вызывает ошибку. Я почти уверен, что это как-то связано с моим циклом For в функции HeapSort(). Кто-нибудь может помочь?

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;
}

person Mike    schedule 17.03.2013    source источник


Ответы (2)


Ошибка:

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.

person taocp    schedule 17.03.2013

Вы пишете вне границ на

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; 
person Community    schedule 17.03.2013