Используя код, взятый где-то на веб-страницах, я попытался внедрить функцию радикальной сортировки в свою программу. Входные данные для программы — текстовый файл, содержащий приблизительно 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++;
}}
1200000 int занимает не менее 1200000 * 4/1024 ^ 2 = 4,7 МБ, и вы объявляете свой массив в стеке, которого может быть недостаточно для размера стека …
Вы пытались вместо этого объявить b [] в куче?
пытаться
int *b = new int[maxSize];
вместо
int b[maxSize];
Вы неправильно читаете файл. Вы должны проверять EOF, потому что оператор извлечения всегда возвращает поток, который вы ему дали (см. http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/). Скорее всего, вы портите память, после чего все ставки выключены. Пытаться:
while (!inputFile.eof() && size<maxSize)
{
inputFile >> arr[size++];
}