当我将数组值赋值为rand()
或任何常数值时,我感到非常困惑,为什么此C++代码段的行为不同。快速排序为常数提供stackoverflow但不是随机数
const int MIN_SIZE = 10000;
const int MAX_SIZE = 100000;
int main()
{
for(j = MIN_SIZE; j <= MAX_SIZE; j += MIN_SIZE) {
int *arrPtr = new int[j];
for(int i = 0; i < j; i++)
arrPtr[i] = 1; //When I put rand() here, it works fine but in any constant it gives stack overflow
quickSort(arr, 0, j - 1);
delete []arrPtr;
}
}
上述基本的代码创建与j
在每匝一个动态分配的阵列大小,这得到由MIN_SIZE
(10,000)递增,并且分配一些特定整数每个索引。赋值后,它将与我将在下面提供的快速排序算法分类,然后在完成时释放此数组。这整件事重复到MAX_SIZE
(100,000)。
这里是我的快速排序代码:
void quickSort(int *arr, int front, int rear)
{
if (front < rear)
{
int part = partition(arr, front, rear);
quickSort(arr, front, part - 1);
quickSort(arr, part + 1, rear);
}
}
int partition(int *arr, int front, int rear)
{
int element = arr[rear];
int i = front - 1;
for (int j = front; j<rear; ++j)
{
if (arr[j] <= element)
{
++i;
long temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
long temp = arr[i + 1];
arr[i + 1] = arr[rear];
arr[rear] = temp;
return i + 1;
}
我试图实现其严格使用最后一个项目为支点快速排序算法。在这种情况下,我面临着一个奇怪的问题:当我使用rand()
函数将数组的每个值赋给一个随机数时,一切正常,但是,当我输入一个常数值时,数组的大小会上升到4039(当你操纵MAX_SIZE和MIN_SIZE时)则给出堆栈溢出错误。我真的很困惑,为什么地球上会引起问题,此外,为什么4039?
检查分区的返回值。我想你有一个运行的方式递归,由于分区返回一个错误的值,导致快速排列整个数组一遍又一遍。 –
这功课吗?如果是这样的话,那么在网络和SO上的快速排序会有很多帮助。否则...使用'vector'和内置的'sort'算法。 10次中有9次会比你写的速度快。 –
当数组中的所有元素都相同时,数组已经被排序,并且如果数组已经排序,那么使用quicksort会导致最坏的情况。 [请参阅此解释](https://en.wikipedia.org/wiki/Quicksort#Choice_of_pivot)。 –