Избегать ошибки сегментации в C ++ Radix Sort?

Используя код, взятый где-то на веб-страницах, я попытался внедрить функцию радикальной сортировки в свою программу. Входные данные для программы — текстовый файл, содержащий приблизительно 1,2 миллиона длинных целых. У меня уже есть массив maxSize = 1200000, в котором хранятся целые числа из текстового файла, поэтому, когда я создаю рабочий массив в функции radixSort, я получаю ошибку сегмента. Есть ли способ избежать этого?

Вот код драйвера:

case 5:
//Sort using Radix Sort
startTime = clock();

radixSort(array, size);
writeArray(radixFile, array, size);
radixFile.close();

endTime = clock();
timeUsed = (endTime-startTime)/(double)CLOCKS_PER_SEC;
cout << "Time elapsed: " << timeUsed << " seconds" << endl;
break;

и вот функция

void radixSort(int *array,int size){

int i,b[maxSize],m=0,exp=1;

for(i=0;i<size;i++){
if(array[i]>m)
m=array[i];
}

while(m/exp>0)
{
int bucket[10]={0};

for(i=0;i<size;i++)
bucket[array[i]/exp%10]++;

for(i=1;i<10;i++)
bucket[i]+=bucket[i-1];

for(i=size-1;i>=0;i--)
b[--bucket[array[i]/exp%10]]=array[i];

for(i=0;i<size;i++)
array[i]=b[i];

exp*=10;
}
}

также выдержка из main, где создается массив:

    int main(){

int choice, size=0, x=0;
int *array = NULL;
array = new int[maxSize];

и где определяется размер:

void readArray(ifstream &inputFile, int arr[], int &size){
size = 0;
while (inputFile >> arr[size]){
size++;
}}

-1

Решение

1200000 int занимает не менее 1200000 * 4/1024 ^ 2 = 4,7 МБ, и вы объявляете свой массив в стеке, которого может быть недостаточно для размера стека …

Вы пытались вместо этого объявить b [] в куче?

пытаться

int *b = new int[maxSize];

вместо

int b[maxSize];
1

Другие решения

Вы неправильно читаете файл. Вы должны проверять EOF, потому что оператор извлечения всегда возвращает поток, который вы ему дали (см. http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/). Скорее всего, вы портите память, после чего все ставки выключены. Пытаться:

while (!inputFile.eof() && size<maxSize)
{
inputFile >> arr[size++];
}
0

По вопросам рекламы [email protected]