代码:
int* NewArr = CreateArray(size);
FillRandom(NewArr,size);
Quicksort(NewArr,0,size-1);
功能:
int* CreateArray(int length){
int* arr= new int[length];
return arr;
}
void FillRandom(int *array, int size){
for (int i=0;i<size;i++){
array[i]=rand()%20;
}
}
void Quicksort (int* array, int left, int right){
if(left<right)
{
int m=left;
for(int i=left+1;i<=right;i++)
if(array[i]<array[left])
swap(array[++m],array[i]);
swap(array[left],array[m]);
Quicksort(array,left,m-1);
Quicksort(array,m+1,right);
}
}
该算法适用于30-50k的元素。然后它将无法在100k上运行,崩溃与堆栈溢出异常。任何人都可以给我一个暗示,为什么会这样?我认为这是因为int限制,但它是32768但这个代码适用于50k元素。
答案 0 :(得分:0)
您可能正在达到计算机上的最大堆栈大小,进一步达到&#34; int&#34;类型可能因操作系统而异。我建议只使用&#34; long long&#34;或更好的&#34; size_t&#34;如果你认为int是一个问题。
但是,根据手头的信息,你可能已达到最大堆栈大小。这可能是因为递归(每次你保存一个新的左右变量),每个级别一直向下生成一个大的数字堆栈变量。正如mellamokb已经提到的那样,你没有为quicksort正确迭代,实际上你正在创建100k递归调用。
答案 1 :(得分:0)
因为您只使用[0,20]范围内的数字,所以会遇到具有相同数字的子数组。如果你有这样一个长度为K的子阵列,那么做这个子阵列时的递归深度将是K,因为你做了长度为K-1,K-2,K-3的子阵列......如果你从100,000个元素开始,那么你应该期望K的值在5,000范围内。这可能会导致堆栈溢出。尝试临时删除FillRandom中的%20。
即使您没有获得堆栈溢出,您也将获得O(n ^ 2)运行时。那很糟糕。