使用从互联网上的某个地方获取的代码,我试图在我的程序中实现基数排序功能。该程序的输入是一个包含大约120万个长整数的文本文件。我已经有一个maxSize = 1200000数组来存储文本文件中的整数,所以当我在radixSort函数中创建工作数组时,我得到一个seg错误。有没有办法避免这种情况?
这是驱动程序代码:
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++;
}}
答案 0 :(得分:1)
1200000 int需要至少1200000 * 4/1024 ^ 2 = 4.7 MiB并且你在堆栈上声明你的数组,这对于堆栈大小可能是不够的......
您是否尝试在堆上声明b []?
试
int *b = new int[maxSize];
而不是
int b[maxSize];
答案 1 :(得分:0)
您正在错误地阅读该文件。你应该检查EOF,因为提取操作符总是返回你给它的流(见http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/)。你很可能在这里破坏了记忆,之后所有的赌注都被取消了。尝试:
while (!inputFile.eof() && size<maxSize)
{
inputFile >> arr[size++];
}