1

そこで、doubleの配列とその配列のサイズを取り込んでソートするヒープソートプログラムを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に渡されて乱数が入力されます。他のすべての関数を徹底的にチェックしましたが、エラーはヒープソート関数から発生していると確信しています。

4

1 に答える 1

2

次の行int halfSize = sizeOfArray-1 / 2;では、右側が として評価されsizeOfArray-(1 / 2)ます。整数除算の(1 / 2)結果は、値0で初期化されます。配列の最後からループを開始します。代わりにあなたがするつもりだったと思います。halfSizesizeOfArray(sizeOfArray-1) / 2

于 2012-10-18T15:59:13.633 に答える