ошибка памяти при сортировке кучей С++

Итак, я написал программу сортировки кучи на C++, которая принимает массив двойных значений и размер массива, а затем сортирует его. Однако программа работает, когда я пытаюсь передать ей массивы больше 1000, я получаю «Ошибка шины: 10». Я думаю, что это связано с тем, как распределяется память, однако я не могу найти решение.

    #ifndef _HEAPSORT_
    #define _HEAPSORT_

void Heapsort(double arrayToSort[], int sizeOfArray);

void Heapsort(double arrayToSort[], int sizeOfArray)
{

//      Building Heap:
// ==========================

int halfSize = sizeOfArray-1 / 2;

for(int i = halfSize; i >= 0; i--){
    double temp = arrayToSort[i];
    int I1 = i, I2 = i+i;
    do {
        if( I2 < sizeOfArray - 1 && arrayToSort[I2+1] > arrayToSort[I2] ) { I2++; }
        if( arrayToSort[I2] > temp ){
            arrayToSort[I1] = arrayToSort[I2];
            I1 = I2;
            I2 = I1+I1;
        } else {
            I2 = sizeOfArray;
        }
    } while ( I2 < sizeOfArray );
    arrayToSort[I1] = temp;
}

//      Sorting Heap:
// =========================

for(int i = sizeOfArray-1; i >= 2; i--){ // i is the number of still competing elements
    double temp = arrayToSort[i];
    arrayToSort[i] = arrayToSort[0]; // store top of the heap
    int I1 = 0, I2 = 1;
    do {
        if((I2+1) < i && arrayToSort[I2+1] > arrayToSort[I2] ) { I2++; }
        if(arrayToSort[I2] > temp ){
            arrayToSort[I1] = arrayToSort[I2];
            I1 = I2;
            I2 = I1+I1;
        } else {
            I2 = i;
        }
    } while( I2 < i );
    arrayToSort[I1] = temp;

}

double Temp = arrayToSort[1];
arrayToSort[1] = arrayToSort[0];
arrayToSort[0] = Temp;
}

#endif /* _HEAPSORT_ */

Буду очень признателен за любое понимание того, как я могу это исправить. Вот код, где я выделяю память.

#include <iostream>
#include "heapsort.h"
#include "rmaset.h"
#include "ranmar.h"
#include "common.h"


using namespace std;

int main(void)
{
const int size = 1000;
struct Common block;

rmaset(block);

double array[size];

for(int i = 0; i < size; i++){
    array[i] = ranmar(block);
}

Heapsort(array,size);


return 0;
}

Это просто создает структуру, которая затем передается функции, которая ее инициализирует, а затем другой функции ranmar, которая заполняет ее случайными числами. Я тщательно проверил все остальные функции и уверен, что ошибка возникает из-за функции Heapsort.


person Loourr    schedule 18.10.2012    source источник
comment
Возможно, дело в том, как распределяется память. К сожалению, вы не разместили код, в котором вы выделяете память. Лучше выложите полную программу, если это возможно.   -  person john    schedule 18.10.2012
comment
Посмотрите, поможет ли это Ошибка шины: ошибка 10   -  person Devendra D. Chavan    schedule 18.10.2012
comment
Я просто объявляю массив определенного размера, а затем передаю его функции Heapsort.   -  person Loourr    schedule 18.10.2012
comment
Я думаю, что, скорее всего, OP статически выделяет память. И выделение 1000 * 8 байтов может быть слишком много на платформе OP?   -  person askmish    schedule 18.10.2012
comment
В этом int halfSize = sizeOfArray-1 / 2; правая сторона оценивается как sizeOfArray-(1 / 2). Я думаю, вы хотели сделать (sizeOfArray-1) / 2 вместо этого.   -  person Blastfurnace    schedule 18.10.2012
comment
Правильно ли вы сортируете код, когда у вас меньше 1000 номеров? Дайте нам ключ здесь!   -  person john    schedule 18.10.2012
comment
Все правильно, однако Blastfurnace был прав, это была просто ошибка оценки. Однако я не понимаю, почему он все еще правильно сортируется с этой ошибкой в ​​​​коде и почему это вызывает ошибку памяти с большими размерами.   -  person Loourr    schedule 18.10.2012
comment
Нет, это не должно сортироваться правильно. Нет, без исправления @BlastFurnace. Вы нарушили приоритет оператора.   -  person askmish    schedule 18.10.2012


Ответы (1)


В следующей строке int halfSize = sizeOfArray-1 / 2; правая сторона оценивается как sizeOfArray-(1 / 2). Целочисленное деление (1 / 2) приводит к 0, поэтому оно инициализирует halfSize значением sizeOfArray. Вы начинаете цикл с конца массива. Я думаю, вы хотели сделать (sizeOfArray-1) / 2 вместо этого.

person Blastfurnace    schedule 18.10.2012